关于窗口句柄的问题

时间:2010-03-12 12:11:52

标签: c#-2.0

lang:c#.net 2.0

我有一个Application X,它调用SubWindows 1,2和3。

当打开1,2或3时,我会弹出一个MessageBox。

我的想法是一个计时器,每3秒钟一次,并检查窗口是否打开。

但是如何找到3个确切的窗口?我可以在我的代码中使用Window-Handle-Spy-Application和Hardcode Window-Handles来查找它们吗?或者在打开Application X时更改窗口句柄?

1 个答案:

答案 0 :(得分:1)

我将回答Win32的问题,因为我比.Net Framework更熟悉Win32,你可以在.Net Framework中找到相应的函数,或者使用P / Invoke来调用这些Win32函数。 / p>

我假设你知道以下内容:

  • 应用程序X的进程ID。
  • 名称(或文本)或Windows 1,2,3以及这些窗口具有唯一可识别文本。

如果您不知道进程ID,则需要枚举进程并将每个进程的名称与Application X进行比较,当您获得匹配时,您就知道进程ID。

要找到三个窗口,我们需要做的第一件事就是找到带有进程ID的顶级窗口。其中一个将是子窗口的祖先。

使用EnumWindows()枚举所有窗口;在枚举期间记下所有具有您正在寻找的进程ID的窗口(可能有多个窗口)。

使用与进程ID匹配的窗口列表,您需要检查该列表中每个窗口的所有后代。你可以使用EnumChildWindows();确保你做了儿童窗户的所有子窗口,直到没有更多。这样你就可以覆盖整个过程中的每个窗口。对于您找到的每个窗口,将其与您要查找的子窗口的已知文本进行比较。当你在某个地方找到HWND的匹配商店时,你可以使用它。

现在你有了HWND,我假设你可以把它们变成.Net可用的Windows控件。

我做了一个快速搜索,似乎EnumWindows不是.Net Framework的一部分,所以你必须使用P / Invoke来完成这项工作。您可以更容易地在C / C ++中编写辅助函数来执行所有搜索并只返回数组中的HWND - 这样您只需要通过P / Invoke调用一个函数并完成所有工作搜索可以在C / C ++中完成,直接调用Win32会更直接。