我有这个问题。我有一个特定应用程序的mainWindow的处理程序,我想在该应用程序上模拟一个按键...
我正在使用sendMessage / postMessage api调用来执行此操作。我之所以不使用.Net SendKeys函数或win32 api的keybd_event,是因为它们在全局范围内模拟了按键。在我的情况下,我可能会将应用程序最小化,并且仍然希望模拟按键。
sendMessage和postMessage的问题在于您必须传递精确子窗口的处理程序,您希望按下该键。例如,在记事本中,如果我将密钥发送到mainWindow,没有任何反应,我必须将密钥发送到子窗口,该窗口基本上由可以写入的白色画布组成。
使用msPaint,例如,如果用户创建一个新文档,并在该图形中打开一个文本框,并且我想在那里模拟一个按键,我必须得到主窗口的子窗口的子窗口才能工作。
所以我找到了一种似乎适用于所有情况的方法,基本上,我使用带有参数GW_CHILD的getWindow来获取具有最高z值的子窗口。然后我再次为子窗口做这个并继续这样做直到某个childWindow没有更多的childWindows ..
它似乎工作,我很高兴!
然而......我发现这种情况不起作用。 Firefox就是其中之一。 Firefox有mainWindow,然后有一个与mainWindow几乎相同的childWindow,然后它有另一个childWindow,即网站区域,即地址栏和菜单下的区域。例如,如果我在www.google.com上,并且我想在焦点搜索框中模拟按键,它可以工作,因为获取子窗口的子窗口会给我正确的childWindow。但是,如果用户点击地址栏,例如,getWindow的工作方式没有任何变化。它最终仍会获得地址栏下的子窗口,什么也不做,而不是模拟地址栏上的按键。
问题是我没有找到获取某个应用程序的活动子窗口的方法。我只能使用GetWindow方法获取某个窗口的子窗口,直到找到没有子节点的子窗口。但是,正如您在firefox中看到的那样,活动窗口实际上是我最终得到的子窗口的父窗口。
我尝试过像getTopWindow这样的其他api调用,但我没有运气..
任何人都可以对这个问题有所了解吗? 谢谢!
答案 0 :(得分:0)
如果应用程序违反了窗口的窗口规则,则需要例外。
在Mozilla,就像这样(IIRC):
MozillaUIWindowClass
的“上帝”窗口以及窗口文本中的“ - Mozilla Firefox”字符串。并提供“神”窗口的HWND
和地址栏的位置。
HWND ChildWindowFromPoint(HWND, POINT);
可能有一个更好的解决方案,我想出了这个,因为我需要自动化鼠标,这是基于位置的。
有关详细信息,您可能需要查阅特定软件的sources,或在Spy +中度过一整天。产品:>
答案 1 :(得分:0)
您可以使用GetGUIThreadInfo
获取有关特定流程的用户界面的信息。
如果您有主窗口,可以调用GetWindowThreadProcessId
来获取进程线程ID。然后,您可以致电GetGUIThreadInfo
以获取有关活动/聚焦窗口的信息等。
我还必须指出,某些应用程序只有一个窗口,其所有控件都是无窗口的(如Windows Live Messenger)。