Delphi获得进程的窗口句柄的三种方法

delphi获得进程的窗口句柄的三种方法

一、FindWindow函数

FindWindow函数用来查询主窗口(子窗口不能查询),并且返回窗口句柄。
函数原型:HWND FindWindow( LPCSTR lpClassName, LPCSTR lpWindowName );

  • praram[in] lpClassName:以NULL结尾的字符串,如果为NULL,则查找所有与lpWindowName的窗口;
  • param[in] lpWindowName:以NULL结尾的字符串,表示需要查找的窗口的名称(窗口标题),如果为NULL,查找所有窗口。
  • return 返回窗口的句柄,如果没有查询到返回NULL,可以用GetLastError()获取失败原因。
  • 二、使用FindWindow获取

    在Delphi中获取其它进程的窗口句柄,首先使用:FindWindow
    如: handle :=FindWindow('notepad',nil);
    或者:handle := FindWindow(nil,PChar('窗口的标题'));

    三、使用GetWindow来遍历查找

    第二种方法用GetWindow来遍历查找,如:

    procedure TForm1.Button1Click(Sender: TObject);
    hCurrentWindow: HWnd;
    WndText:String;
    begin
    hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);
    while hCurrentWindow <> 0 do
    begin
    WndText:=GetWndText(hCurrentWindow);
    if UpperCase(WndText)='窗口的标题' then begin
    hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);

    四、 通过进程快照查找

    前两种方法存在较大的弊端。因为这两种方法都是根据其它进程的标题来查找的,如果其它进程的标题在运行时不断的发生变化,那么这两种方法就无法没办法用了。
    第三种方法是通过进程的文件名来查找窗口句柄。首先通过进程快照得到要查找的进程ID(ProcessId),其次,再跟据ProcessId获取进程的窗口句柄。代码如下:

    uses TLHelp32;  
    procedure TForm1.Button1Click(Sender: TObject);   
     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);  
       ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);  
     CloseHandle(FSnapshotHandle);   //   释放快照句柄  
    //跟据ProcessId获取进程的窗口句柄  
    function TForm1.GetHWndByPID(const hPID: THandle): THandle;  
       PEnumInfo = ^TEnumInfo;  
       TEnumInfo = record  
       ProcessID: DWORD;  
       HWND: THandle;  
       function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;  
       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;   
       function FindMainWindow(PID: DWORD): DWORD;  
       EI: TEnumInfo;  
       begin  
       EI.ProcessID := PID;  
       EI.HWND := 0;  
       EnumWindows(@EnumWindowsProc, Integer(@EI));  
       Result := EI.HWND;  
    begin  
       if hPID<>0 then  
       Result:=FindMainWindow(hPID)