• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi获取其它进程窗口句柄的3种方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
本文主要跟大家介绍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;  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap