代码之家  ›  专栏  ›  技术社区  ›  Apocalisp

检索Delphi窗口句柄

  •  6
  • Apocalisp  · 技术社区  · 15 年前

    我正在尝试从外部应用程序获取Delphi应用程序的窗口句柄。我可以看到创建了一些窗口(tapplication、tfrmmain和其他一些窗口),我知道tapplication是“控制器”,但从不可见。但是,我可以读取实际窗口的值吗?我知道它是tfrmmain(对于这个特定的应用程序),但是是否有可能以某种方式实际解决这个问题?信息是存储在窗口属性中还是其他地方?谢谢!

    3 回复  |  直到 15 年前
        1
  •  12
  •   Rob Kennedy    15 年前

    不,没有文档记录的方法来发现哪个窗口代表 Application.MainForm 从应用程序外部。在Delphi的新版本中,主窗体的窗口句柄不一定是 Application.MainForm.Handle 无论如何,应用程序可以处理 OnGetMainFormHandle 事件返回用于为模式对话框选择父窗口的任何他们想要返回的内容。

    你可以 猜测 通过查找类名中带有“main”的窗口,即使找到了一个,也不能保证只有一个实例。应用程序可以有多个顶级窗口,在这种情况下,将它们中的任何一个指定为“主”窗口都没有多大意义。

        2
  •  4
  •   Deltics    15 年前

    的类名 任何 Delphi窗体也是基础“Windows窗口”的注册窗口类名。所以你应该能够使用 FindWindow() Windows API调用以获取tfrmmain的窗口句柄,如下所示:

     hWnd := FindWindow('TFrmMain', NIL);
    

    如果给定表单类名(可能)有多个实例,则可以使用第二个参数(窗口名,即“标题”或“标题”)来区分它们。如果这仍然不够,那么你可能需要更复杂一点,看看使用 EnumWindows() 函数并检查窗口的属性以找到感兴趣的窗口。

    测试arbiary窗口句柄的类名(例如,在与一起使用的回调函数中) 枚举窗口 ())使用 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
    

    如果没有特定实现挑战的具体细节,就很难确定哪一个最适合您,但希望这足以让您走上正确的道路。

        3
  •  1
  •   ErvinS    15 年前

    我通常使用 WinDowse 为了帮助我开始,但是你必须使用Deltics描述的API函数。