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
展开
 我来答
ljl88900
2009-08-11 · TA获得超过2661个赞
知道大有可为答主
回答量:2197
采纳率:100%
帮助的人:2624万
展开全部
已知进程名称或PID,是无法准确定位窗体句柄的。

这是因为:一旦程序启动后,系统只分配给它一个PID,而一个程序往往有多个窗口。所以,要想从PID反向查找对应的窗口不具有唯一性,并已经过实践证明,往这方面研究只能走入死胡同。

解决此问题办法是:先枚举所有窗口句柄,然后取得对应的进程名称或PID,如果该进程或PID满足你的条件,则可以进行相应处理。
tianqing20wen

2009-08-11 · TA获得超过2.4万个赞
知道大有可为答主
回答量:8226
采纳率:88%
帮助的人:5099万
展开全部
你很厉害啊~今天才学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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuan50019
2009-08-11 · TA获得超过1688个赞
知道小有建树答主
回答量:746
采纳率:0%
帮助的人:458万
展开全部
问题写得模模糊糊..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,不知道我理解对没有
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ynq1q2
2016-09-20 · TA获得超过456个赞
知道小有建树答主
回答量:64
采纳率:100%
帮助的人:37.9万
展开全部
这部分代码只能放在 模块里用。
不然系统不能取得 正确的 地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1360384
2009-08-12 · TA获得超过1213个赞
知道小有建树答主
回答量:1425
采纳率:0%
帮助的人:521万
展开全部
人才啊!我学俩月才敢试着接触动 应用程序接口函数~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式