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

 

posted @   _成飞  阅读(1278)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示