3

我有这个代码:

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

但它不起作用...

有任何想法吗?

4

2 回答 2

4

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

于 2011-10-11T21:23:12.087 回答
3

我已经尝试了很多次,如果它有效,它会被击中或错过。您想要做的是尝试使用 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 发送到“菜单”句柄才能保存文件(在说记事本),这也有效。

于 2011-10-11T21:21:46.430 回答