工具类
internal class KeyboardUtil
{
/// <summary>
/// 模拟键盘的方法
/// </summary>
/// <param name="key" >按键的虚拟键值</param>
/// <param name= "dwFlags" >选项标志:0:表示按下,2:表示松开</param>
private static void keydownup(string key, uint dwFlags)
{
if (equalsIgnoreCase(key, "ctrl"))
{
keybd_event(Keys.ControlKey, 0, dwFlags, 0);
}
else if (equalsIgnoreCase(key, "alt"))
{
keybd_event(Keys.Menu, 0, dwFlags, 0);
}
else if (equalsIgnoreCase(key, "shift"))
{
keybd_event(Keys.ShiftKey, 0, dwFlags, 0);
}
else
{
foreach (Keys myCode in Enum.GetValues(typeof(Keys)))
{
string strName = Enum.GetName(typeof(Keys), myCode);//获取名称
if (equalsIgnoreCase(strName, key))
{
keybd_event(myCode, 0, dwFlags, 0);
}
}
}
}
// 根据按键名模拟按下,如:a,ctrl+a
public static void keyDown(string key)
{
keydownup(key, 0);
}
// 根据按键名模拟弹起,如:a,ctrl+a
public static void keyUp(string key)
{
keydownup(key, 2);
}
// 根据键码模拟按下
public static void keyCodeDown(int keyCode)
{
keybd_event((Keys)keyCode, 0, 0, 0);
}
// 根据键码模拟弹起
public static void keyCodeUp(int keyCode)
{
keybd_event((Keys)keyCode, 0, 2, 0);
}
/// <summary>
/// 导入模拟键盘的方法
/// </summary>
/// <param name="bVk" >按键的虚拟键值</param>
/// <param name= "bScan" >扫描码,一般不用设置,用0代替就行</param>
/// <param name= "dwFlags" >选项标志:0:表示按下,2:表示松开</param>
/// <param name= "dwExtraInfo">一般设置为0</param>
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
/*
* 忽略大小写比较字符串
*/
private static bool equalsIgnoreCase(string a, string b)
{
return a.Equals(b, StringComparison.OrdinalIgnoreCase);
}
}
使用
根据keycode模拟键盘按下
KeyboardUtil.keyCodeDown(87); // 模拟按下W
根据按键名模拟按下
KeyboardUtil.keydown("a"); // 模拟按下a键
模拟按下组合键
模拟按下 ctrl + a:
KeyboardUtil.keydown("ctrl");
KeyboardUtil.keydown("a");
KeyboardUtil.keyup("a");
KeyboardUtil.keyup("ctrl");