如何在没有传递handle参数的情况下使用Delphi在dll项目中获取宿主应用程序句柄

时间:2015-08-19 08:35:57

标签: delphi winapi

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 致电GetCurrentProcessId以获取您的进程ID。
  2. 致电EnumWindows以枚举所有顶级窗口。
  3. 在枚举回调中,对于每个顶级窗口,调用GetWindowThreadProcessId以获取拥有该窗口的进程ID。与步骤1中找到的进程ID匹配的任何内容均来自您的进程。
  4. 您遇到的问题是第3步可能会识别出多个此类窗口。您可以调用GetWindow传递GW_OWNER以获取窗口的所有者,并使用它来减少候选字段。您认为主窗口可能没有所有者,但其他顶级窗口可能是拥有的。即便如此,也无法保证将该字段缩减为单个候选字段,您很可能需要提出一些额外的逻辑。