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


    转载于https://www.cnblogs.com/jijm123/p/6487356.html

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

    第四种方法通过鼠标的位置来获取当前鼠标所在窗体的句柄

    var
      a:TPoint; //用来存放坐标
      hw:HWND; //用来存放窗口句柄
    begin
      GetCursorPos(a);  //取得鼠标坐标,并存放进a中
      hw := WindowFromPoint(a); //取得变量a 对应的 窗口句柄
    end
    
  • 相关阅读:
    Undo/Redo的C#实现方式
    c#中@符号作用
    面向对象理解随笔
    C# 面向对象定义常量,属性,方法
    c# 字段和属性
    面向对象思想
    用C表达面向对象语言的机制——C#版
    判断生日
    查找字符
    被7整除
  • 原文地址:https://www.cnblogs.com/sttchengfei/p/13037171.html
Copyright © 2020-2023  润新知