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)
但这行不通...
有任何想法吗?
我已经尝试过很多次了,如果它有效的话,它是成败的。您想要做的是尝试使用 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 发送到“菜单”句柄才能保存文件(例如记事本),这也可以。