【问题标题】:How can I get host application handle in dll project with Delphi without passing handle parameter如何在不传递句柄参数的情况下使用 Delphi 在 dll 项目中获取主机应用程序句柄
【发布时间】:2015-08-19 08:35:56
【问题描述】:

我有一个 dll 项目。我必须获得主机应用程序句柄。我无法将主机应用程序的句柄传递给 dll 项目,因为主机应用程序不是我的。

主机应用程序在第二台监视器上运行,但是当主机应用程序调用我的表单 (dll) 时,第一台监视器中显示的表单。我必须检测主机应用程序的屏幕坐标,或者我必须对主机应用程序在第一台显示器或第二台显示器上运行的技术进行检测。

【问题讨论】:

  • 请定义“主机应用程序句柄”。这是什么?你打算用它做什么?
  • @TLama:没有 活动窗口之类的东西。每个线程(或一组输入附加线程)可以有一个活动窗口,通过调用GetActiveWindow 进行查询。
  • @TLama:这就是所谓的前景窗口。调用GetForegroundWindow 时返回。 前台窗口也总是前台线程的活动窗口
  • @IInspectable,谢谢!然后我收回我的评论。

标签: delphi winapi


【解决方案1】:

您正在寻找流程中的顶级窗口。像这样找到它们:

  1. 致电GetCurrentProcessId 获取您的进程ID。
  2. 调用EnumWindows 枚举所有顶级窗口。
  3. 在枚举回调中,对于每个顶级窗口,调用GetWindowThreadProcessId获取拥有该窗口的进程ID。与第 1 步中找到的进程 ID 匹配的任何进程都来自您的进程。

您面临的问题是第 3 步可能会识别多个此类窗口。您可以通过GW_OWNER 调用GetWindow 来获取窗口的所有者并使用它来修剪候选人的字段。您认为是主窗口的可能没有所有者,但其他顶层窗口很可能是拥有的。即使这样也不能保证将字段缩减为单个候选人,您很可能需要提出一些额外的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2013-06-04
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多