【发布时间】:2017-10-12 01:09:55
【问题描述】:
我正在创建一个函数来获取所有带有 processid 的窗口句柄。
我的代码:
unit untCommonUitls;
interface
uses
System.SysUtils, Winapi.Windows, Winapi.Messages, System.Classes;
function GetWindowHandlesByPID(const cPID: Cardinal): TStringList;
var
slHandles: TStringList;
implementation
function GetWindowHandlesByPID(const cPID: Cardinal): TStringList;
var
hFound: THandle;
function EnumWindowsProcMy(_hwnd: HWND; ProcessId: Cardinal): BOOL; stdcall;
var
dwPid: Cardinal;
begin
GetWindowThreadProcessId(_hwnd, @dwPid);
if ProcessId = dwPid then
begin
hFound := _hwnd;
slHandles.Add(IntToStr(hFound));
end;
end;
begin
if not Assigned(slHandles) then
begin
slHandles := TStringList.Create;
end;
slHandles.Clear;
EnumWindows(@EnumWindowsProcMy, LPARAM(cPID));
Result := slHandles;
end;
当我尝试这段代码时,一切正常,EnumWindowsProcMy 多次调用,slHandles 获取句柄列表;
但在其他情况下,它不起作用。 EnumWindowsProcMy 只调用一次,所以slHandles 为空。
【问题讨论】:
-
从您的
EnumWindowsProcMy返回值(Result := True;,如果您想枚举所有窗口)。我不知道它背后是什么,但你错过了它。而且我不会为该回调使用嵌套函数。 -
@Victoria 谢谢。缺少返回值是我的错。
-
编译器警告错误。不要忽视警告和提示。
标签: delphi winapi window-handles