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时更改窗口句柄?
答案 0 :(得分:1)
我将回答Win32的问题,因为我比.Net Framework更熟悉Win32,你可以在.Net Framework中找到相应的函数,或者使用P / Invoke来调用这些Win32函数。 / p>
我假设你知道以下内容:
如果您不知道进程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会更直接。