我正在尝试从外部应用程序获取Delphi应用程序的窗口句柄。我可以看到创建了一些窗口(TApplication,TFrmMain和其他几个),我知道TApplication是“控制器”,但从未见过。但是,我能读一下真实窗口的值是什么吗?我知道它是TFrmMain(对于这个特定的应用程序),但它是否有可能以某种方式实现这一点?信息是存储在窗口属性中还是其他地方?谢谢!
答案 0 :(得分:13)
不,没有记录的方法可以从应用程序外部发现哪个窗口代表Application.MainForm
。在较新版本的Delphi中,主窗体的窗口句柄不一定是Application.MainForm.Handle
;应用程序可以处理OnGetMainFormHandle
事件以返回他们想要的任何内容 - 用于选择模态对话框的父窗口。
你可以通过在类名中查找带有“main”的窗口来猜测,但即使你找到了一个,也不能保证它只有一个实例。应用程序可以有多个顶级窗口,在这种情况下,将它们中的任何一个指定为“主要”窗口没有多大意义。
答案 1 :(得分:4)
任何 Delphi表单的类名也是底层“Windows窗口”的注册窗口类名。因此,您应该能够使用FindWindow() Windows API调用来获取TFrmMain的窗口句柄,例如:
hWnd := FindWindow('TFrmMain', NIL);
如果存在(可能)给定表单类名称的多个实例,则可以使用第二个参数(窗口名称,即“标题”或标题)来区分它们。如果仍然不够,那么您可能需要更复杂一些,并查看使用EnumWindows()函数并检查窗口的属性以找到感兴趣的窗口。
要测试arbirary窗口句柄的类名(例如,在与 EnumWindows ()一起使用的回调函数中),请使用GetClassName(),例如:
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
如果没有具体实施挑战的具体细节,很难说哪种方法最适合您,但希望这应该足以让您走上正确的轨道。
答案 2 :(得分:1)
我通常使用WinDowse来帮助我开始使用,但是你必须使用Deltics所描述的API函数。