Delphi獲取其它進程窗口句柄的3種方法


轉載:http://blog.csdn.net/chinazhd/article/details/6566535

本文主要跟大家介紹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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM