PostMessage WM_KEYDOWN发送乘法键?

Dan*_*npe 2 .net c# winapi postmessage process

我有以下代码:

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

        foreach (Process proc in processes)
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
    }
Run Code Online (Sandbox Code Playgroud)

此代码发送了向右箭头键,我想发送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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但这行不通...

有任何想法吗?

Eri*_*ips 5

我已经尝试过很多次了,如果它有效的话,它是成败的。您想要做的是尝试使用 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); 
Run Code Online (Sandbox Code Playgroud)

更新:

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

  • 是的,不会的。使用 SendInput,或者更好的是 UI 自动化。 (2认同)
  • @DavidHeffernan 有时,如果您尝试将密钥发送到非活动窗口,则 SendInput 不是有效的解决方案。 (2认同)

shf*_*301 5

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

  • +1 我更正了你的链接。显然你的意思是指向雷蒙德的一篇文章。 (2认同)