PostMessage WM_KEYDOWN send multiply keys?
I have this code:
public static void Next()
{
Process[] processes = Process.GetProcessesByName("test");
foreach (Process proc in processes)
开发者_开发问答 PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0);
}
This code sents the Right Arrow key, i want to sent ALT+CTRL+RIGHT i tried this:
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);
}
}
But it doesn't work...
Any ideas?
You can't simulate keyboard input with PostMessage, at least not reliably use SendInput instead.
I have tried this so many times and it's hit or miss if it works. What you want to do is try to use WM_SYSKEYDOWN instead of WM_KEYDOWN for "system" type keys. This also means you have to use WM_SYSKEYUP. Something like this might work:
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);
Update:
I've it only to simulate key presses for single keys, it works great even for minimized applications :). When using it as a combination key for "shift" states is where it's hit or miss. The problem is most windows applications have a control and each control has it's on handle so sending a key to the window doesn't have the desired affect, you have to send ALT+S to the "Menu" handle to make a file save (in say Notepad), which also works.
精彩评论