【问题标题】:Get WindowHandle by ProcessId通过进程 ID 获取窗口句柄
【发布时间】:2015-08-08 13:12:31
【问题描述】:

在 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 并将所需的句柄保存在那里。

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

【问题讨论】:

标签: delphi


【解决方案1】:

不要使用“嵌入式”函数。像您的 C++ 代码一样使用独立函数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2012-05-06
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多