zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    3574. 乘积数量
    1357. 优质牛肋骨
    1356. 回文质数
    3554. 二进制
    13 vue路由跳转传参
    12 el-form的inline属性
    10 js数组赋值问题
    9 彻底搞懂json字符串和json对象
    8 element自定义卡槽的好处
    7 el-table表格中使用Dropdown 下拉菜单无法显示下拉框的问题
  • 原文地址:https://www.cnblogs.com/jijm123/p/6487356.html
Copyright © 2011-2022 走看看