[英]Retrieving Delphi Window Handles
我试图从外部应用程序获取Delphi应用程序的窗口句柄。 我可以看到创建了一些窗口(TApplication,TFrmMain和其他几个),我知道TApplication是“控制器”,但从未见过。 但是,我能读一下真实窗口的值是什么吗? 我知道它是TFrmMain(对于这个特定的应用程序),但它是否有可能以某种方式实现这一点? 信息是存储在窗口属性中还是其他地方? 谢谢!
不,没有记录的方法来发现哪个窗口代表Application.MainForm
外部的Application.MainForm。 在较新版本的Delphi中,主窗体的窗口句柄不一定是Application.MainForm.Handle
; 应用程序可以处理OnGetMainFormHandle
事件以返回他们想要的任何内容 - 用于选择模式对话框的父窗口。
您可以通过在类名中查找带有“main”的窗口来猜测 ,但即使您找到了一个,也无法保证只有一个实例。 应用程序可以有多个顶级窗口,在这种情况下,将它们中的任何一个指定为“主要”窗口没有多大意义。
任何 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
如果没有具体实施挑战的具体细节,很难说最有可能最适合您,但希望这应该足以让您走上正确的轨道。
我通常使用WinDowse来帮助我开始,但是你必须使用Deltics所描述的API函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.