繁体   English   中英

检索Delphi窗口句柄

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM