我有一个C ++控制台应用程序,可以将一些按键发送到一个通用窗口......
我正在尝试使用EnumWindows()
找到包含消息队列(用于输入)的所有打开窗口,并且我的回调存储了一些信息,它有GetWindowText()
,GetWindowThreadProcessId()
和PostThreadMessage()
(检查是否有消息队列,WM_NULL
消息)以及HWND hWnd
... [以下代码]
提示:这是正确的还是我应该使用 EnumChildWindows()
?
继续...
我希望将键击例如ALT+F4
或CTRL+T
等发送到其中一个窗口...
提示:这是最好的方法吗? SendInput()
或PostThreadMessage()
?
[HALF自动回复] :我正在尝试SendInput()
,使用{{1}在VirtualKey中使用扫描代码的翻译发送一组INPUT
},例如myVKey = MapVirtualKeyEx(..., MAPVK_VSC_TO_VK, ...)
和ALT
为F4
,56
为62
类型,int
为HEX
和{{ 1}} ...我使用38
进行输入,然后以相反的顺序使用3E
进行输入
(我只需要处理一组命令,没有其他像单个字符等...);
我认为VKey优于硬件扫描代码(对吗?)
第三个问题:在使用dwFlags = 0
之前,我应该如何启用该窗口?
让我们假设我有关于窗口的所有信息......
我必须使用dwFlags = KEYEVENTF_KEYUP
,SendInput()
和/或SetFocus()
的内容和顺序? [所有评论]
一些代码:
SetActiveWindow()
任何帮助将不胜感激。感谢..
编辑:真实场景是一个C / S应用程序,其中客户端说“我对所选窗口执行CTRL + W”并想象一个向服务器发送“CTRL +”的C#客户端W“用于谷歌浏览器的消息(例如)服务器应该发送到其线程输入队列......我需要放入”谷歌Chrome“来发送输入”CTRL + W“..不要担心任何竞争条件或其他..如果需要,客户将再次发送命令......
答案 0 :(得分:0)
首先,我不确定你为什么需要EnumChildWindows()
。您必须提供更明确的信息,说明EnumWindows()
无效的原因。
其次,PostMessage()
可能是将消息发送到另一个窗口的最温和的方法。但是,根据每个应用程序处理自己输入的方式,您的消息可能会被忽略或过滤。如果你知道你要定位的应用程序以及它如何响应消息,我会尽可能使用PostThreadMessage()
。
只有具有键盘焦点的窗口才能看到通过SendInput()
发送的关键信息。此外,如果要发送包含修改序列的关键消息,请按ctrl,alt,shift等键;你必须发送像make ctrl, make T, break T, break ctrl
这样的序列。
我的建议:不要担心扫描代码,您只需要处理虚拟密钥。扫描码是传统的; USB键盘硬件甚至不生产它们(Windows确实如此)。
第三,你需要的只是SetForgroundWindow()
。
答案 1 :(得分:0)
您的Windows 8或Windows 10阻止了您。
在Windows 8安全模型中,应用程序没有成为UI自动化客户端所需的权限。但您可以编写一个桌面应用程序,充当自动化客户端,并将您的应用作为目标。为此,需要使用UIAccess权限构建桌面自动化客户端应用程序。
将清单更改为UIAccess =“true”并获取管理员权限,创建证书,使用该证书对应用程序进行签名,将其放在Program Files下的某个位置,然后运行它。正如这里所解释的
https://msdn.microsoft.com/en-us/library/windows/desktop/dd979761.aspx?f=255&MSPPError=-2147217396
在这里
加上这个
https://msdn.microsoft.com/en-us/library/ms742884.aspx?f=255&MSPPError=-2147217396
和这个
答案 2 :(得分:0)
感谢所有人。我已经在StackOverflow过去的问题上找到了答案。
1:这是正确还是我还应该使用EnumChildWindows()
?
A:否我不需要它,因为几乎所有的孩子都会收到来自家长的输入。
2:这是最好的方法吗? SendInput()
或PostThreadMessage()
?
A:SendInput()
使用虚拟密钥。
3:我必须使用什么以及以何种顺序使用SetFocus(),SetActiveWindow()和/或 SetForegroundWindow()
?
答:足够SetFocus()
。