Delphi获取其它进程窗口句柄的3种方法
来源:互联网 发布:网络病毒感染途径 编辑:程序博客网 时间:2024/05/06 03:03
Delphi获取其它进程窗口句柄的3种方法
作者:张国斌
本文主要跟大家介绍Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如:
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获取进程的窗口句柄。以下为本文章的代码:
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;
欢迎转载本博原创文字和图片,但请注明作者和出处!
- Delphi获取其它进程窗口句柄的3种方法
- Delphi获取其它进程窗口句柄的3种方法
- Delphi获取其它进程窗口句柄的3种方法
- Delphi获取其它进程窗口句柄的3种方法
- 如何获取其它窗口的句柄
- C#获取进程的主窗口句柄的实现方法
- 获取窗口句柄的方法
- 通过进程获取窗口的句柄
- 通过进程获取窗口的句柄
- C#获取进程的主窗口句柄
- C#获取进程的主窗口句柄
- C#获取进程的主窗口句柄
- C#获取进程的主窗口句柄
- 窗口句柄浅析和获取窗口句柄的方法
- 窗口句柄浅析和获取窗口句柄的方法
- Process 后, 如何获取打开窗口的句柄(根据进程句柄获取窗口句柄)
- mfc获取其它程序窗口句柄
- 获取窗口句柄(VC)的几种方法
- Firefox中event.KeyCode无效的问题
- 类中的非静态const常量,静态Const常量
- ant 通配符
- 让场景的一部分全屏显示
- Microsoft confirms Windows 7 family pack
- Delphi获取其它进程窗口句柄的3种方法
- java实现简单XMPP发送消息和文件的简单例子
- 用户名不同的计算机之间的调用dcom[整理]
- xml解析
- yum介绍(一种管理软件包的工具)
- bzip2, bzcat 压缩指令
- Struts2 第一个实例学习
- spring-dm学习一
- Seam 中的事务管理