我正在尝试从外部应用程序获取Delphi应用程序的窗口句柄。我可以看到创建了几个窗口(TApplication,TFrmMain和其他一些窗口),我知道TApplication是“控制器”,但从未可见。然而,我能否读取真实窗口的值?我知道它是TFrmMain(对于这个特定的应用程序),但是否可能通过某种方式实际上找出这一点呢?信息存储在窗口属性中还是其他地方?谢谢!
没有记录的方法可以从应用程序外部发现哪个窗口代表Application.MainForm
。在较新版本的Delphi中,主窗体的窗口句柄不一定是Application.MainForm.Handle
;应用程序可以处理OnGetMainFormHandle
事件以返回任何它们想要的内容——这用于选择模态对话框的父窗口。
您可以通过查找类名中带有“main”字样的窗口来猜测,但即使您找到了一个,也不能保证只有一个实例。应用程序可以具有多个顶级窗口,在这种情况下,将任何一个窗口指定为“主”窗口并没有太多意义。
任何 Delphi 表单的类名也是底层 "Windows 窗口" 的注册窗口类名。因此,您应该能够使用 FindWindow() Windows API 调用来获取 TFrmMain 窗口句柄,类似于:
hWnd := FindWindow('TFrmMain', NIL);
function GetWindowClassName(const aHWND: HWND): String;
var
buf: array[0..255] of Char; // Tip: Use a more appropriately sized array
begin
GetClassName(SomeHWND, @buf, Length(buf));
result := buf;
end;
...
if SameText(GetWindowClassName(hwnd), 'TFrmMain') then
...
etc
如果没有您特定实现挑战的具体细节,很难确定哪种方法最适合您,但希望这些提示足以让您朝着正确的方向前进。