c#在Windows 8以下操作系统上模拟键盘按键

本文关键字:模拟 键盘 操作系统 Windows | 更新日期: 2023-09-27 18:15:50

我在c#中使用以下代码来模拟键盘按压:

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hwnd);
void sim_key(string text, string proc)
{
    var process = Process.GetProcessesByName(proc).FirstOrDefault();
    if (process != null && process.MainWindowHandle != IntPtr.Zero)
    {
        SetForegroundWindow(process.MainWindowHandle);
        SendKeys.Send(kat_id);
    }
}

我在Windows Xp、7、8.1、10和Server 2012上进行了测试。在windows 7和Xp上,外部应用程序窗口处理得很好,但是没有发送密钥。在Win 7以上的系统上,一切正常。我该怎么修理它?

编辑:我在32位和64位机器上的。net 4.0客户端配置文件和。net 4.6.1上检查了它,但结果与上面描述的相同。

c#在Windows 8以下操作系统上模拟键盘按键

我想你可以用这个粗略的代码

    const int WM_CHAR = 0x0102;
    const int WM_KEYDOWN = 0x0100;
if (process != null && process.MainWindowHandle != IntPtr.Zero)
    {
      PostMessage(process.MainWindowHandle, WM_CHAR, (int) <a character you want to send> , 1);
    }
使用

PostMessage(process.MainWindowHandle, WM_KEYDOWN, 13, 1);

发送"Enter"。

注意,您可以使用SendMessage而不是PostMessage。不同之处在于,最后一个不需要等待密钥的处理。它们有相同的签名:

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

如果您只想发送密钥,则不需要调用SetForegroundWindow(process.MainWindowHandle);

谢谢你的回答。我尝试使用PostMessage发送Ctrl+F10到另一个窗口。下面是我的代码:

public const int WM_KEYDOWN = 0x100;
public const int WM_KEYUP = 0x101;
public const int VK_CONTROL = 0x11;
public const int VK_F10 = 0x79;
PostMessage(process.MainWindowHandle, WM_KEYDOWN, VK_CONTROL, null);
PostMessage(process.MainWindowHandle, WM_KEYDOWN, VK_F10, null);
PostMessage(process.MainWindowHandle, WM_KEYUP, VK_F10, null);
PostMessage(process.MainWindowHandle, WM_KEYUP, VK_CONTROL, null);

但是,它不会将密钥传递给应用程序。