Delphi获取其它进程窗口句柄的4种方法
转载于https://www.cnblogs.com/jijm123/p/6487356.html
本文主要跟大家介绍Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | handle := FindWindow( nil , PChar ( '窗口的标题' )); //或者: procedure TForm1 . Button1Click(Sender: TObject); var hCurrentWindow: HWnd; WndText: String ; begin hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST); while hCurrentWindow <> 0 do begin WndText:=GetWndText(hCurrentWindow); if UpperCase(WndText)= '窗口的标题' then begin ... ... end ; hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT); end ; end ; |
因为目前网络上绝大部分的代码都是介绍用这两种方法取得其它进程的窗口句柄。虽这两种方法都可以达到查找其它进程的窗口句柄的目的,但本人认为这两都方法存在较大的弊端。因为这两种方法都是根据其它进程的标题来查找的,如果其它进程的标题在运行时不断的发生变化,那么这两种方法就无法没办法用了。
第三种通过进程的文件名来查找窗口句柄。首先通过进程快照得到要查找的进程ID(ProcessId),其次,再跟据ProcessId获取进程的窗口句柄。以下为本文章的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | uses TLHelp32; procedure TForm1 . Button1Click(Sender: TObject); var ProcessName : string ; //进程名 FSnapshotHandle:THandle; //进程快照句柄 FProcessEntry32:TProcessEntry32; //进程入口的结构体信息 ContinueLoop:BOOL; MyHwnd:THandle; begin FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 ); //创建一个进程快照 FProcessEntry32 . dwSize:=Sizeof(FProcessEntry32); ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程 //循环例举 while ContinueLoop do begin ProcessName := FProcessEntry32 . szExeFile; if (ProcessName = '要找的应用程序名.exe' ) then begin MyHwnd := GetHWndByPID(FProcessEntry32 . th32ProcessID); ... ... end ; ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32); end ; CloseHandle(FSnapshotHandle); // 释放快照句柄 end ; //跟据ProcessId获取进程的窗口句柄 function TForm1 . GetHWndByPID( const hPID: THandle): THandle; type PEnumInfo = ^TEnumInfo; TEnumInfo = record ProcessID: DWORD; HWND: THandle; end ; function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall; var PID: DWORD; begin GetWindowThreadProcessID(Wnd, @PID); Result := (PID <> EI . ProcessID) or ( not IsWindowVisible(WND)) or ( not IsWindowEnabled(WND)); if not Result then EI . HWND := WND; end ; function FindMainWindow(PID: DWORD): DWORD; var EI: TEnumInfo; begin EI . ProcessID := PID; EI . HWND := 0 ; EnumWindows(@EnumWindowsProc, Integer (@EI)); Result := EI . HWND; end ; begin if hPID<> 0 then Result:=FindMainWindow(hPID) else Result:= 0 ; end ; |
第四种方法通过鼠标的位置来获取当前鼠标所在窗体的句柄
1 2 3 4 5 6 7 | var a:TPoint; //用来存放坐标 hw:HWND; //用来存放窗口句柄 begin GetCursorPos(a); //取得鼠标坐标,并存放进a中 hw := WindowFromPoint(a); //取得变量a 对应的 窗口句柄 end |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!