【问题标题】:Pressing Win+X, Alt-Tab programmatically以编程方式按 Win+X、Alt-Tab
【发布时间】:2012-12-20 12:23:29
【问题描述】:

我正在尝试在 Windows 8 上模拟 Win+X 的按键事件,这应该会弹出一个小菜单,但我无法通过使用 SendInput 来实现它。对于任何其他组合键(例如 Win+R、Win+E、Win+D),它都有效,但不适用于 Win+X。我注意到 Synergy+ 有同样的问题,但 Windows 屏幕键盘没有。我还查看了屏幕键盘使用的 SendInput 参数,但如果我在我的应用程序中使用完全相同的参数,我仍然看不到菜单。

所以我的问题是,我该如何让它工作?或者是否有其他方式来显示此菜单?

【问题讨论】:

    标签: c++ windows-8 keyboard sendinput


    【解决方案1】:

    我最近在我们的应用程序中添加了对此的支持。很高兴我们击败了我们的竞争对手!

    Windows 8 中有新的 UIPI 限制。最常用的阻止快捷方式是 Alt+Tab,因此您需要解决此问题。

    您必须在清单中使用uiAccess="true" 标记您的二进制文件。 (有关如何执行此操作的更多详细信息,请 google。)此清单可防止启动二进制文件,除非使用 Microsoft 批准的代码签名证书进行签名并安装在“安全位置”(system32 或 Program Files/Program Files (x86)) .

    如果您从任何帮助程序启动您的程序: uiAccess 二进制文件无法从中等完整性进程使用CreateProcess 启动(清单将其标记为需要“高”完整性)。相反,最简单的方法是使用ShellExecute "open" 启动它,让 shell 提升它。如果使用CreateProcessAsUser,则必须使用SetTokenInformationTokenUIAccess设置为1,否则启动会失败。

    最后的附带条件:请注意,uiAccess 严格限制了进程可以执行的操作。您无法从正常(中等完整性)进程接收 UI 输入,因此其他应用程序无法与您的窗口进行交互。如果您尚未遵循将 UI 分离到单独进程中的良好做法,那么这将是这样做的一个很好的理由。或者,可以将需要 uiAccess 的任务放入一个小的、自包含的辅助二进制文件中,并与非 UI 进程完全分离。您的主应用可以将其作为高完整性帮助进程运行,该进程会根据需要发送指令以执行这些特定任务(例如 SendInput)。

    最后,SendInput 会起作用。

    【讨论】:

    • 现在你的竞争对手在这里得到了提醒。 :-)
    • 我怀疑有人会因为这个而改变程序...... ;)
    • 请注意,uiAccess = true 可能会阻止从其他权限较低的程序拖放。
    • 这里的另一个补充。您可以从服务中使用 CreateProcessAsUser 启动 uiAccess 进程,但您必须先使用 SetTokenInformation 将 TokenUIAccess 设置为 1。
    • @Maurice 极好的更正!我尝试了各种技巧来启动一个跨会话的 uiAccess 程序,但无法找到方法,尽管考虑到我们的流程结构,它并不需要。谢谢!我会修复答案。
    猜你喜欢
    • 2015-06-20
    • 2012-01-23
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多