C# 模拟键盘按下 OS below 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 上,外部应用程序 window 得到了正确处理,但是钥匙没有被发送。在 Win 7 以上的系统上,一切都是正确的。我该如何解决?
编辑:
我在 32 位和 64 位机器上的 .NET 4.0 客户端配置文件和 .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
。不同的是最后一个不等待key的处理。他们有相同的签名:
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
如果您只想发送密钥,则无需调用 SetForegroundWindow(process.MainWindowHandle);
。
感谢您的回答。我尝试使用 PostMessage 将 Ctrl+F10 发送到另一个 window。这是我的代码:
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);
但是,它不会将密钥传递给应用程序。
我在 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 上,外部应用程序 window 得到了正确处理,但是钥匙没有被发送。在 Win 7 以上的系统上,一切都是正确的。我该如何解决?
编辑: 我在 32 位和 64 位机器上的 .NET 4.0 客户端配置文件和 .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
。不同的是最后一个不等待key的处理。他们有相同的签名:
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
如果您只想发送密钥,则无需调用 SetForegroundWindow(process.MainWindowHandle);
。
感谢您的回答。我尝试使用 PostMessage 将 Ctrl+F10 发送到另一个 window。这是我的代码:
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);
但是,它不会将密钥传递给应用程序。