加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 主窗口按进程名称处理

发布时间:2020-12-15 10:05:07 所属栏目:大数据 来源:网络整理
导读:Delphi Xe,Win7x64 如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口). 例: function MyGetWinHandle(path:String):HWND; ... handle := MyGetWinHandle('c:windowssystem32notepad.exe'); 解决方法 我
Delphi Xe,Win7x64

如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口).

例:

function MyGetWinHandle(path:String):HWND;
 ...
 handle := MyGetWinHandle('c:windowssystem32notepad.exe');

解决方法

我同意Petesh的说法,你需要枚举顶级窗口并检查创建它的进程的模块文件名.为了帮助您开始枚举顶级窗口,这是一个delphi实现.

首先,当你回调给你时,你需要一些与EnumWindows方法通信的方式.为此声明一条记录,该记录将保存您要查找的模块的文件名以及找到该进程的句柄:

TFindWindowRec = record
  ModuleToFind: string;
  FoundHWnd: HWND;
end;

然后你需要声明并实现EnumWindows方法将为每个顶级窗口调用的回调函数:

function EnumWindowsCallBack(Handle: hWnd; var FindWindowRec: TFindWindowRec): BOOL; stdcall;

请注意stdcall;在宣言结束时.这指定了重要的调用约定,因为Delphi的默认调用约定与Windows API的调用约定不同.

您的回调函数的实现可能如下所示:

function EnumWindowsCallBack(Handle: hWnd; var FindWindowRec: TFindWindowRec): BOOL; stdcall;
const
  C_FileNameLength = 256;
var
  WinFileName: string;
  PID,hProcess: DWORD;
  Len: Byte;
begin
  Result := True;
  SetLength(WinFileName,C_FileNameLength);
  GetWindowThreadProcessId(Handle,PID);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
  Len := GetModuleFileNameEx(hProcess,PChar(WinFileName),C_FileNameLength);
  if Len > 0 then
  begin
    SetLength(WinFileName,Len);
    if SameText(WinFileName,FindWindowRec.ModuleToFind) then
    begin
      Result := False;
      FindWindowRec.FoundHWnd := Handle;
    end;
  end;
end;

句柄是EnumWindows当前正在处理的顶级窗口的句柄.您可以使用它来获取该窗口的模块文件名.回调的结果确定EnumWindows是否应该继续枚举窗口.找到所需内容后返回false.

当然,您仍然需要在运动中设置整个枚举操作:

var
  FindWindowRec: TFindWindowRec;

function IsNotePadOpen: Boolean;
begin
  FindWindowRec.ModuleToFind := 'c:windowssystem32notepad.exe';
  FindWindowRec.FoundHWnd := 0;
  EnumWindows(@EnumWindowsCallback,integer(@FindWindowRec));
  Result := FindWindowRec.FoundHWnd <> 0;
end;

请注意,上面的代码会找到EnumWindows方法枚举的第一个记事本窗口,可能会有更多,可能没有.由您决定如何处理这些情况.

主窗口可以是不可见的,因此您可以在回调函数中的If(Len> 0)之后添加和(IsWindowInvisble(Handle)).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读