
纠正你一下,得知路径是获取不了目标进程的句柄的。通过API函数 OPENPROCESS 可以获取进程的句柄,不过要注意的是,进程句柄不一定是窗口的句柄,好好理解这句话。HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID ); hProcess //进程句柄pID //进程ID 如果你想取某个窗口句柄的话,最好不要通过进程ID转换的方式,这会让你离目标越来越远。
已知进程名称或PID,是无法准确定位窗体句柄的。
这是因为:一旦程序启动后,系统只分配给它一个PID,而一个程序往往有多个窗口。所以,要想从PID反向查找对应的窗口不具有唯一性,并已经过实践证明,往这方面研究只能走入死胡同。
解决此问题办法是:先枚举所有窗口句柄,然后取得对应的进程名称或PID,如果该进程或PID满足你的条件,则可以进行相应处理。
这段代码你看下 希望对你有帮助 Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String 1024
End Type
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'查找进程的函数
Private Function fun_FindProcess(ByVal ProcessName As String) As Long
Dim strdata As String
Dim my As PROCESSENTRY32
Dim l As Long
Dim l1 As Long
Dim mName As String
Dim i As Integer, pid As Long
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
mydwSize = 1060
If (Process32First(l, my)) Then
Do
i = InStr(1, myszExeFile, Chr(0))
mName = LCase(Left(myszExeFile, i - 1))
If mName = LCase(ProcessName) Then
pid = myth32ProcessID
fun_FindProcess = pid
Exit Function
End If
Loop Until (Process32Next(l, my) < 1)
End If
l1 = CloseHandle(l)
End If
fun_FindProcess = 0
End Function
Private Sub Form_Load()
if fun_FindProcess("123exe") <> 0 then
Text1Text="123exe程序已启动"
Else
Text1Text = ""
End If
End Sub
只能获取最前的那个窗口句柄
版本 2
子程序 进程_名取句柄0, 整数型, , 找不到将返回0
参数 进程名, 文本型
局部变量 sHandle, 整数型
局部变量 Pn, PROCESSENTRY32
局部变量 lpTe, THREADENTRY32
局部变量 Found, 整数型
局部变量 ret, 整数型
局部变量 sThread, 整数型
局部变量 tFound, 整数型
sHandle = CreateToolhelp32Snapshot (15, 0)
Pndwsize = 296
Found = Process32First (sHandle, Pn)
判断循环首 (Found ≠ 0)
如果真 (到小写 (到文本 (PnszExefile)) = 到小写 (进程名))
sThread = CreateToolhelp32Snapshot (4, 0)
lpTedwSize = 28
tFound = Thread32First (sThread, lpTe)
判断循环首 (tFound ≠ 0)
如果真 (lpTeth32OwnerProcessID = Pnth32ProcessID)
EnumThreadWindows (lpTeth32ThreadID, &EnumThreadWndProc, ret)
跳出循环 ()
如果真结束
tFound = Thread32Next (sThread, lpTe)
判断循环尾 ()
CloseHandle (sThread)
跳出循环 ()
如果真结束
Found = Process32Next (sHandle, Pn)
判断循环尾 ()
CloseHandle (sHandle)
返回 (ret)
子程序 EnumThreadWndProc, 整数型
参数 hwnd, 整数型
参数 lParam, 整数型, 参考
局部变量 lHwnd1, 整数型
局部变量 lHwnd2, 整数型
lHwnd1 = GetParent (hwnd)
判断循环首 (lHwnd1 ≠ 0) ' 用取父窗口的方法,循环找到他祖宗 :)
lHwnd2 = lHwnd1
lHwnd1 = GetParent (lHwnd1)
判断循环尾 ()
如果真 (lHwnd2 ≠ 0)
lParam = lHwnd2
返回 (0)
如果真结束
返回 (1)
版本 2
DLL命令 CreateToolhelp32Snapshot, 整数型
参数 dwFlags, 整数型
参数 th32ProcessID, 整数型
DLL命令 Process32First, 整数型
参数 hSnapShot, 整数型
参数 uProcess, PROCESSENTRY32
DLL命令 Thread32First, 整数型, "KERNEL32DLL", "Thread32First"
参数 hSnapshot, 整数型
参数 lpte, THREADENTRY32
DLL命令 EnumThreadWindows, 整数型, "user32", "EnumThreadWindows"
参数 dwThreadId, 整数型
参数 lpfn, 子程序指针
参数 lParam, 整数型, 传址
DLL命令 Thread32Next, 整数型, "KERNEL32DLL", "Thread32Next"
参数 hSnapshot, 整数型
参数 lpte, THREADENTRY32
DLL命令 CloseHandle, 整数型, "kernel32"
参数 hObject, 整数型
DLL命令 Process32Next, 整数型
参数 hSnapShot, 整数型
参数 uProcess, PROCESSENTRY32
DLL命令 GetParent, 整数型, "user32", "GetParent"
参数 hwnd, 整数型
版本 2
数据类型 PROCESSENTRY32
成员 dwsize, 整数型, , , 296
成员 cntusage, 整数型, , , 引用数
成员 th32ProcessID, 整数型, , , 进程标识符
成员 th32defaultheapid, 整数型, , , 默认堆ID
成员 th32moduleid, 整数型, , , 进程模块标识符
成员 cntthreads, 整数型, , , 线程数
成员 th32ParentProcessID, 整数型, , , 父进程标识符
成员 pcpriclassbase, 整数型, , , 线程优先权
成员 dwflags, 整数型
成员 szExefile, 字节型, , "260", 进程名称
数据类型 THREADENTRY32
成员 dwSize, 整数型
成员 cntUsage, 整数型
成员 th32ThreadID, 整数型
成员 th32OwnerProcessID, 整数型
成员 tpBasePri, 整数型
成员 tpDeltaPri, 整数型
成员 dwFlags, 整数型
虽说不麻烦吧 但是贴出来也不少代码先声明下API 需要用到一个APIDLL命令 GetWindowThreadProcessId, 整数型, "user32dll", "GetWindowThreadProcessId"
参数 窗口句柄, 整数型
参数 进程标识符, 整数型, 传址下面就是详细代码了版本 2
支持库 eAPI子程序 _按钮1_被单击
局部变量 进程ID, 整数型
局部变量 句柄组, 文本型, , "0"
局部变量 I, 整数型
局部变量 文本标题, 文本型
局部变量 PID, 整数型
局部变量 文本, 文本型进程ID = 进程名称取PID (“QQexe”)
如果真 (进程ID = -1)
信息框 (“进程没有打开啊”, #错误图标, )
返回 ()
如果真结束
句柄组 = 取所有窗口列表 ()
文本标题 = 编辑框1内容
计次循环首 (取数组成员数 (句柄组), I)
GetWindowThreadProcessId (到整数 (句柄组 [I]), PID)
如果真 (PID = 进程ID)
文本 = 取窗口标题 (到整数 (句柄组 [I]))
如果真 (文本 = 文本标题)
信息框 (“窗口已经打开”, 0, )
返回 ()
如果真结束 如果真结束计次循环尾 ()
信息框 (“窗口未打开”, 0, )子程序 进程名称取PID, 整数型
参数 进程名, 文本型
局部变量 进程, 进程信息, , "0"
局部变量 i, 整数型进程 = 取系统进程列表 ()
计次循环首 (取数组成员数 (进程), i)
如果真 (进程 [i]进程名称 = 进程名)
返回 (进程 [i]进程标识符)
如果真结束计次循环尾 ()
返回 (-1)
先获取该进程对象,用ID或者名称都行。
int 进程Id = 1;Process 获取指定ID进程 = ProcessGetProcessById(进程Id);
Process[] 获取所有指定名称的进程 = ProcessGetProcessesByName("进程名称");
然后Handle属性就是该进程的句柄了。
首先说想取得其他程序的窗口句柄,怎么说都需要用到模块。大家都是在系统上运行,只有你的电脑系统知道那个程序的一切信息。你若想取出必须经过系统取,那么就要求系统提供这么一个支持的接口。当然了系统支持,最常见的便是API。windows系统的API非常强大,很多与系统交互都可以靠API。所以API就是一个模块,是系统对外辅助的支持接口模块。
没有接口与模块是做不到的,所以不要说不用模块。首先,像 精易模块、超级模块 这些易语言的整合模块中 很多命令就是通过调用API实现的。
所以你要用到API,既然如此直接用模块。有些东西不是你必须理解的,尤其对于您是初学者来说。就像你不需要去学汽车构造一样,你只要学了驾照就能开汽车。等你真正可以不用模块的时候,那是你充分了解了系统及漏洞,是计算机大师级人物了。
-------------------------------------------------------------------------------
其次,下面这个是:超级模块 中的命令,可以直接通过进程名取出窗口句柄。
子程序名:取进程窗口
通过进程ID与窗口标题来获取窗口句柄(成功返回窗口句柄,失败返回0)
返回值类型:整数型
参数<1>的名称为“进程ID”,类型为“整数型”。注明:窗口所在进程ID。
参数<2>的名称为“标题”,类型为“文本型”,允许接收空参数数据。注明:窗口标题。
参数<3>的名称为“必须可见”,类型为“逻辑型”,允许接收空参数数据。注明:默认为假:可以是不可见窗口 真:必须是可见窗口。
以上就是关于delphi 知道路径和进程如何获取窗口句柄全部的内容,包括:delphi 知道路径和进程如何获取窗口句柄、vB 通过进程名称获取窗体句柄、如何通过进程得到窗体句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)