通过ProcessId获取WindowHandle

时间:2015-08-08 13:12:32

标签: delphi

在c ++中,人们可以这样做:

HWND g_HWND=NULL;
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
    DWORD lpdwProcessId;
    GetWindowThreadProcessId(hwnd,&lpdwProcessId);
    if(lpdwProcessId==lParam)
    {
        g_HWND=hwnd;
        return FALSE;
    }
    return TRUE;
}

EnumWindowsProcMy,m_ProcessId);

link

德尔福翻译将是:

function GetWindowHandle(ProcessId: Cardinal): THandle;
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;
    Result := False;
  end
  else
    Result := True;
end;

begin
  EnumWindows(@EnumWindowsProcMy, LPARAM(ProcessId));
  Result := hFound;
end;

然而,似乎"嵌入式"函数无法正确访问变量 hFound

如果我在函数(全局变量)之外声明变量,它可以正常工作。但这在设计上很糟糕。

解决这个问题的一种方法是将记录传递给 EnumWindowProcMy 并将所需的句柄保存在那里。

但是我想知道为什么代码不起作用,因为我认为我正确地翻译了它。

1 个答案:

答案 0 :(得分:1)

不要使用"嵌入式"功能。像使用C ++代码一样使用独立函数。

嵌套函数不能作为指针传递。一个好的经验法则是,如果必须使用@运算符让编译器允许您传递函数指针,那么它的可能错误。始终首先尝试不使用@运算符的函数指针。编译器可能会以这种方式检测错误。

如果您不想使用全局变量,但需要将多个信息单元传递给回调函数,则需要使用记录。 C ++代码不使用记录,因为它使用全局变量。这就是你的翻译偏离原文的地方。