【问题标题】:PostMessage WM_KEYDOWN send multiply keys?PostMessage WM_KEYDOWN 发送多个键?
【发布时间】:2011-10-11 21:17:19
【问题描述】:

我有这个代码:

    public static void Next()
    {
        Process[] processes = Process.GetProcessesByName("test");

        foreach (Process proc in processes)
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
    }

此代码发送右箭头键,我想发送 ALT+CTRL+RIGHT 我试过这个:

    public static void Forward()
    {
        Process[] processes = Process.GetProcessesByName("test");

        foreach (Process proc in processes)
        {
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_CONTROL, 0);
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_ALT, 0);
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
        }
    }

但它不起作用......

有什么想法吗?

【问题讨论】:

    标签: c# .net winapi process postmessage


    【解决方案1】:

    【讨论】:

    • +1 我更正了您的链接。显然你的意思是指向雷蒙德的一篇文章。
    • 我尝试理解 SendInput 上的示例但没有成功。我需要将键发送到在我的 PC 上运行的非聚焦进程,而不是从我的键盘,从不同的事件,如按钮点击。
    • @Danpe,如果窗口没有聚焦,那么 SendInput 将无法工作。不幸的是,它们不是在 Windows 上模拟输入的可靠方法。
    • 没有使用 PostMessage 发送多个键的解决方法吗?
    • 不,没有解决方法——也许是 UI 自动化(如果客户端应用支持它)——msdn.microsoft.com/en-us/library/ms747327.aspx
    【解决方案2】:

    我已经尝试了很多次,如果它有效,它会被击中或错过。您想要做的是尝试使用 WM_SYSKEYDOWN 而不是 WM_KEYDOWN 作为“系统”类型的键。这也意味着您必须使用 WM_SYSKEYUP。这样的事情可能会奏效:

    PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_CONTROL, 0); 
    PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_ALT, 0); 
    PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0); 
    PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_ALT, 0); 
    PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_CONTROL, 0); 
    

    更新:

    我只用它来模拟单个键的按键,即使是最小化的应用程序也能很好地工作:)。当使用它作为“转变”状态的组合键时,它会被击中或错过。问题是大多数 Windows 应用程序都有一个控件,并且每个控件都有它的句柄,因此向窗口发送键不会产生预期的效果,您必须将 ALT+S 发送到“菜单”句柄才能保存文件(比如说记事本),这也可以。

    【讨论】:

    • 是的,不会。使用 SendInput,或者更好的是 UI 自动化。
    • @DavidHeffernan 如果您尝试将密钥发送到非活动窗口,有时 SendInput 不是一个有效的解决方案。
    • 除非窗口具有输入焦点,否则您无法可靠地伪造窗口输入。您可以可靠地伪造输入到具有输入焦点的窗口。所以,我想这完全取决于你是否想要一些有用的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多