使用SendInput将键击发送到通用窗口c ++

时间:2016-07-31 17:50:50

标签: c++ windows winapi

我有一个C ++控制台应用程序,可以将一些按键发送到一个通用窗口...... 我正在尝试使用EnumWindows()找到包含消息队列(用于输入)的所有打开窗口,并且我的回调存储了一些信息,它有GetWindowText()GetWindowThreadProcessId()PostThreadMessage()(检查是否有消息队列,WM_NULL消息)以及HWND hWnd ... [以下代码]

提示:这是正确的还是我应该使用 EnumChildWindows()

继续...

我希望将键击例如ALT+F4CTRL+T等发送到其中一个窗口...

提示:这是最好的方法吗? SendInput()PostThreadMessage()

[HALF自动回复] :我正在尝试SendInput(),使用{{1}在VirtualKey中使用扫描代码的翻译发送一组INPUT },例如myVKey = MapVirtualKeyEx(..., MAPVK_VSC_TO_VK, ...)ALTF45662类型,intHEX和{{ 1}} ...我使用38进行输入,然后以相反的顺序使用3E进行输入 (我只需要处理一组命令,没有其他像单个字符等...);

我认为VKey优于硬件扫描代码(对吗?)

第三个问题:在使用dwFlags = 0之前,我应该如何启用该窗口? 让我们假设我有关于窗口的所有信息......

我必须使用dwFlags = KEYEVENTF_KEYUPSendInput()和/或SetFocus()的内容和顺序? [所有评论]

一些代码:

SetActiveWindow()

任何帮助将不胜感激。感谢..

编辑:真实场景是一个C / S应用程序,其中客户端说“我对所选窗口执行CTRL + W”并想象一个向服务器发送“CTRL +”的C#客户端W“用于谷歌浏览器的消息(例如)服务器应该发送到其线程输入队列......我需要放入”谷歌Chrome“来发送输入”CTRL + W“..不要担心任何竞争条件或其他..如果需要,客户将再次发送命令......

3 个答案:

答案 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://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4b6dbc43-a026-4957-9178-91d2001e2d0d/windows-8-block-alttab-simulation#291eb5b4-f6d2-49b6-83db-658bd832f2c9

加上这个

https://msdn.microsoft.com/en-us/library/ms742884.aspx?f=255&MSPPError=-2147217396

和这个

https://translate.google.com/translate?sl=it&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fblogs.msdn.com%2Fb%2Fitasupport%2Farchive%2F2009%2F09%2F16%2Fsendsas-step-by-step.aspx&edit-text=&act=url

答案 2 :(得分:0)

感谢所有人。我已经在StackOverflow过去的问题上找到了答案。

1:这是正确还是我还应该使用EnumChildWindows()

A:我不需要它,因为几乎所有的孩子都会收到来自家长的输入。

2:这是最好的方法吗? SendInput()PostThreadMessage()

A:SendInput()使用虚拟密钥。

3:我必须使用什么以及以何种顺序使用SetFocus(),SetActiveWindow()和/或 SetForegroundWindow()

答:足够SetFocus()