PostMessage WM_KEYDOWN发送多个键

本文关键字:WM KEYDOWN PostMessage | 更新日期: 2023-09-27 18:11:04

我有这样的代码:

    public static void Next()
    {
        Process[] processes = Process.GetProcessesByName("test");
        foreach (Process proc in processes)
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
    }

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

    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);
        }
    }

但是它不工作…

任何想法?

PostMessage WM_KEYDOWN发送多个键

我已经尝试了很多次,如果它有效,它是命中或失败的。你想做的是尝试使用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); 
更新:

我只模拟单个键的按键,它甚至对最小化的应用程序也很有效:)。当使用它作为"shift"状态的组合键时,它是命中或错过的问题是大多数windows应用程序都有一个控件,每个控件都有它的手柄,所以发送一个键到窗口没有预期的影响,你必须发送ALT+S到"菜单"手柄来保存文件(在记事本中),这也有效。

你不能用PostMessage模拟键盘输入,至少不能可靠地使用SendInput来代替。