【问题标题】:Activate windows "Alt Tab" switcher with SendInput使用 SendInput 激活 Windows“Alt Tab”切换器
【发布时间】:2015-07-26 14:58:21
【问题描述】:

我需要用SendInput 显示Windows 切换器。 Another question我问解释了这样做的原因。简而言之,当我按住Alt Tab 切换到其他应用程序时,我的应用程序可能会使用SendInput 触发击键,这将中断当前切换器,这就是我需要重新触发Alt Tab 的原因。目前我正在发布另一个tab 击键(切换时我仍然按住alt)或完全alt down + tab down & up。但是在按住 alt 的情况下,SendInput 发送的单个选项卡笔划不会触发切换器。而且整个组合键也不起作用。这是一些测试代码。

#include <windows.h>
#include <WinUser.h>
#include <iostream>


int main(void) {
    Sleep(1000 * 3);
    INPUT tabinput[2];
    tabinput[0].type = INPUT_KEYBOARD;
    tabinput[0].ki = {0x09, 0}; // KEY_TAB = 0x09
    tabinput[1].type = INPUT_KEYBOARD;
    tabinput[1].ki = {0x09, 0, KEYEVENTF_KEYUP};
    SendInput(2, tabinput, sizeof(INPUT));
    getchar();
}

我正在尝试触发延迟 3 秒的制表键击键。我拿着alt键。这行不通。但是tab键被触发了,因为当我运行这段代码并切换到文本编辑器什么的时候,会有一个tab事件。我的系统是win8.1 64bit

【问题讨论】:

  • 停止伪造输入,所有问题都会消失
  • @DavidHeffernan 这是什么意思,这是一个常见情况下的具体问题。是的,您可能会说伪造输入不合理或不优雅,您能提出更好的建议来解决我的问题吗?那就是在不伪造输入的情况下重置大写的状态,以免中断当前键或通过伪造输入在中断后重新触发alt选项卡。
  • 对于那些不赞成这个问题和另一个问题的人。请给出你的论点。
  • 通过让用户管理大写锁定状态来解决您的问题。去掉所有的输入伪造,所有的问题都解决了。
  • @DavidHeffernan 如果我什么都不做,我将永远不会遇到这些问题,这听起来很合理。如果您有兴趣,尽管我强烈怀疑根据您的建议,请参阅@Software_Designer 提供的解决方案和我的补充。祝你有美好的一天!

标签: c++ windows winapi input sendinput


【解决方案1】:

Windows 8 阻止了你。

在 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 开始索引的,但是您正在使用从 1 开始的索引来填充数组。因此,您没有填充第一个数组元素,而是在最后一个数组元素之后丢弃内存。改用这个:

int main(void) {
    Sleep(1000 * 3);
    INPUT tabinput[2];
    tabinput[0].type = INPUT_KEYBOARD;
    tabinput[0].ki = {VK_TAB, 0};
    tabinput[1].type = INPUT_KEYBOARD;
    tabinput[1].ki = {VK_TAB, 0, KEYEVENTF_KEYUP};
    SendInput(2, tabinput, sizeof(INPUT));
    getchar();
}

【讨论】:

  • 对不起,我的错误,这是一个测试代码,正如你指出的那样,它做错了。但是即使我修复了错误,这段代码也不能做我想做的事。您是否在您的机器上测试过此代码(按住 alt 键运行它)?如果窗口切换器出现或不出现?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2017-11-01
  • 2011-01-30
相关资源
最近更新 更多