gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:53:41 24 4
gpt4 key购买 nike

德尔福Xe,Win7x64

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

示例:

 function MyGetWinHandle(path:String):HWND;
...
handle := MyGetWinHandle('c:\windows\system32\notepad.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, 0, 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;

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

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

var
FindWindowRec: TFindWindowRec;

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

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

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

关于delphi - 主窗口 按进程名称处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6806911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com