vB 通过进程名称获取窗体句柄
FunctionGetPsPid(sProcessAsString)AsLongDimlSnapShotAsLongDimlNextProcessAsLongDimtPE...
Function GetPsPid(sProcess As String) As Long
Dim lSnapShot As Long
Dim lNextProcess As Long
Dim tPE As PROCESSENTRY32
lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If lSnapShot <> -1 Then
tPE.dwSize = Len(tPE)
lNextProcess = Process32First(lSnapShot, tPE)
Do While lNextProcess
If LCase$(sProcess) = LCase$(Left(tPE.szExeFile, InStr(1, tPE.szExeFile, Chr(0)) - 1)) Then
Dim lProcess As Long
Dim lExitCode As Long
GetPsPid = tPE.th32ProcessID
CloseHandle lProcess
End If
lNextProcess = Process32Next(lSnapShot, tPE)
Loop
CloseHandle (lSnapShot)
End If
End Function
Private Sub Form_Load()
Pid = GetPsPid("tcClient.exe")
dwHandle = OpenProcess(PROCESS_ALL_ACCESS, False, Pid)
End Sub
我是通过方法来获取的。
可能你们说 用这个
hwd = FindWindow("QElementClient Window", "Element Client") 获取
我也想啊。
但是程序的标题很复杂而且是变动的。
所以我想通过他进程名称来找他的窗体句柄
不知道如何实现。
网上找了很多。都没找到。因为本人今天才学VB。所以也请大家口下留情
如果问题解决。绝对加分
问题是。现在我只知道他的进程名称。和PID 如何或者程序的窗提句柄。因为这个程序是隐藏了的。没在任务栏里
我在补充一下哈。
我最近在玩一个游戏。但是 这个游戏只有自动打怪。没自动喝药和拣物的功能。所以我就想写个这个工具 来代替。注意的是 窗口肯定不是当前窗口。比如要玩点其他的游戏。那么这个窗口肯定是最小化到任务栏的。那么我就需要 通过API来发送后台指令。比如没蓝了。就需要程序在后台 按下XX键。来实现后台喝蓝的功能。
昨天晚上我还遇到个问题。比如我一台电脑上开了双开这个游戏。那么我这个工具如何来区别呢??因为他进程名和窗体名称都是一样的。
我用EnumWindows 列举主窗口 怎么报 错啊 提示 操作符 AddressOf 无效
Private Sub Command1_Click()
List1.Clear
'Find_Window Val(Text1.Text)
IfPid = Pid
EnumWindows AddressOf EnumWindowsProc, 0
End Sub 展开
Dim lSnapShot As Long
Dim lNextProcess As Long
Dim tPE As PROCESSENTRY32
lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If lSnapShot <> -1 Then
tPE.dwSize = Len(tPE)
lNextProcess = Process32First(lSnapShot, tPE)
Do While lNextProcess
If LCase$(sProcess) = LCase$(Left(tPE.szExeFile, InStr(1, tPE.szExeFile, Chr(0)) - 1)) Then
Dim lProcess As Long
Dim lExitCode As Long
GetPsPid = tPE.th32ProcessID
CloseHandle lProcess
End If
lNextProcess = Process32Next(lSnapShot, tPE)
Loop
CloseHandle (lSnapShot)
End If
End Function
Private Sub Form_Load()
Pid = GetPsPid("tcClient.exe")
dwHandle = OpenProcess(PROCESS_ALL_ACCESS, False, Pid)
End Sub
我是通过方法来获取的。
可能你们说 用这个
hwd = FindWindow("QElementClient Window", "Element Client") 获取
我也想啊。
但是程序的标题很复杂而且是变动的。
所以我想通过他进程名称来找他的窗体句柄
不知道如何实现。
网上找了很多。都没找到。因为本人今天才学VB。所以也请大家口下留情
如果问题解决。绝对加分
问题是。现在我只知道他的进程名称。和PID 如何或者程序的窗提句柄。因为这个程序是隐藏了的。没在任务栏里
我在补充一下哈。
我最近在玩一个游戏。但是 这个游戏只有自动打怪。没自动喝药和拣物的功能。所以我就想写个这个工具 来代替。注意的是 窗口肯定不是当前窗口。比如要玩点其他的游戏。那么这个窗口肯定是最小化到任务栏的。那么我就需要 通过API来发送后台指令。比如没蓝了。就需要程序在后台 按下XX键。来实现后台喝蓝的功能。
昨天晚上我还遇到个问题。比如我一台电脑上开了双开这个游戏。那么我这个工具如何来区别呢??因为他进程名和窗体名称都是一样的。
我用EnumWindows 列举主窗口 怎么报 错啊 提示 操作符 AddressOf 无效
Private Sub Command1_Click()
List1.Clear
'Find_Window Val(Text1.Text)
IfPid = Pid
EnumWindows AddressOf EnumWindowsProc, 0
End Sub 展开
5个回答
展开全部
你很厉害啊~今天才学VB就想玩API了
窗体代码如下 在TEXT输入进程PID
Private Sub Command1_Click()
List1.Clear
Find_Window Val(Text1.Text)
End Sub
Private Sub Form_Load()
Text1.Text = ""
Command1.Caption = "枚举窗口"
End Sub
模块代码如下
Option Explicit
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Dim IfPid As Long
Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim Pid1 As Long
Dim wText As String * 255
GetWindowThreadProcessId hwnd, Pid1
If IfPid = Pid1 Then
GetWindowText hwnd, wText, 100
Form1.List1.AddItem "句柄:" & hwnd & " 标题:" & wText
End If
EnumWindowsProc = True
End Function
Public Sub Find_Window(ByVal Pid As Long)
IfPid = Pid
EnumWindows AddressOf EnumWindowsProc, 0
End Sub
窗体代码如下 在TEXT输入进程PID
Private Sub Command1_Click()
List1.Clear
Find_Window Val(Text1.Text)
End Sub
Private Sub Form_Load()
Text1.Text = ""
Command1.Caption = "枚举窗口"
End Sub
模块代码如下
Option Explicit
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Dim IfPid As Long
Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim Pid1 As Long
Dim wText As String * 255
GetWindowThreadProcessId hwnd, Pid1
If IfPid = Pid1 Then
GetWindowText hwnd, wText, 100
Form1.List1.AddItem "句柄:" & hwnd & " 标题:" & wText
End If
EnumWindowsProc = True
End Function
Public Sub Find_Window(ByVal Pid As Long)
IfPid = Pid
EnumWindows AddressOf EnumWindowsProc, 0
End Sub
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题写得模模糊糊..API,获得指定名称的窗口的句柄:Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long**********************************************************API,使指定句柄的窗口得到焦点:Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long**********************************************************具体用法可以查阅MSDN,不知道我理解对没有
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这部分代码只能放在 模块里用。
不然系统不能取得 正确的 地址。
不然系统不能取得 正确的 地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
人才啊!我学俩月才敢试着接触动 应用程序接口函数~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询