繁体   English   中英

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

[英]C# Simulating keyboard press on OS below Windows 8

我在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 Client Profile和.NET 4.6.1上进行了检查,但结果与上述相同。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM