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);
}
}
但是它不工作…
任何想法?
我已经尝试了很多次,如果它有效,它是命中或失败的。你想做的是尝试使用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来代替。