如何从句柄中检索组件名称?

lok*_*oki 2 windows delphi winapi setwindowshookex

在我的应用程序中,我通过捕获所有事件SetWindowsHookEx,当用户单击按钮时,我会检索一个 hwnd,我猜它是 Tbutton 的句柄。

typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
  DWORD  lPrivate;
} MSG, *P
Run Code Online (Sandbox Code Playgroud)

现在我如何从这个 hwnd 检索按钮名称(或者更好的是代表按钮的 Delphi 对象?)。

也许我也可以通过POINT pt;?

Ser*_*yuz 6

您可以使用FindControl,如果窗口是由属于调用该函数的 VCL 的同一实例的控件创建的,它将检索对象实例。由于Name是在 中发布的TComponent,因此无论实际的类类型如何,您都可以访问该属性。

每个窗口化 VCL 控件都有其对象实例地址存储在 API 窗口的属性列表中,以及包含模块地址、进程 id、线程 id 信息的属性。这使得 VCL 可以从它创建的窗口回溯控件。

  • 请注意,这仅适用于接收它们的同一进程所拥有的 HWND。`FindControl()` 不适用于其他进程拥有的 HWND。 (4认同)