转载自:http://blog.skydev.cc/
对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂。
主代码:
public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key click flag public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag [DllImport("user32.dll")] private static extern void keybd_event(byte bVk, byte bSCan, int dwFlags, int dwExtraInfo); [DllImport("user32.dll")] private static extern byte MapVirtualKey(byte wCode, int wMap); public static void 模拟按下按键(VirtualKeyCode 虚拟按键代码) { var code = (byte)虚拟按键代码; keybd_event(code, 0, 0, 0); } public static void 模拟弹起按键(VirtualKeyCode 虚拟按键代码) { var code = (byte) 虚拟按键代码; keybd_event(code, 0, KEYEVENTF_KEYUP, 0); } public static void 模拟单击按键(VirtualKeyCode 虚拟按键代码) { var code = (byte)虚拟按键代码; keybd_event(code, 0, KEYEVENTF_EXTENDEDKEY, 0); }
网上关于keybd_event的dwFlags参数功能说法很混乱,经我测试貌似是KEYEVENTF_EXTENDEDKEY表示一次单击,0表示按下,KEYEVENTF_KEYUP表示弹起,不一定完全正确,希望高人指点一下。
另外MapVirtualKey的作用实在不懂,所以就没用上,看到有人这么调用不知有什么区别:
var code = (byte)虚拟按键代码; keybd_event(code, MapVirtualKey(code,0), 0, 0);
我试过好像也没什么变化~到底MapVirtualKey是干什么用的呢??
VirtualKeyCode枚举:
/// <summary> /// 虚拟按键代码 /// 参考于 http://msdn.microsoft.com/zh-cn/library/dd375731(v=vs.85).aspx /// </summary> public enum VirtualKeyCode { /// <summary> /// Left mouse button /// </summary> Left_mouse_button = 0x01, /// <summary> /// Right mouse button /// </summary> Right_mouse_button = 0x02, /// <summary> /// Control-break processing /// </summary> Control_break_processing = 0x03, /// <summary> /// Middle mouse button (three-button mouse) /// </summary> Middle_mouse_button = 0x04, /// <summary> /// X1 mouse button /// </summary> X1_mouse_button = 0x05, /// <summary> /// X2 mouse button /// </summary> X2_mouse_button = 0x06, /// <summary> /// Undefined /// </summary> Undefined1 = 0x07, /// <summary> /// BACKSPACE key /// </summary> BACKSPACE_key = 0x08, /// <summary> /// TAB key /// </summary> TAB_key = 0x09, /// <summary> /// CLEAR key /// </summary> CLEAR_key = 0x0C, /// <summary> /// ENTER key /// </summary> ENTER_key = 0x0D, /// <summary> /// SHIFT key /// </summary> SHIFT_key = 0x10, /// <summary> /// CTRL key /// </summary> CTRL_key = 0x11, /// <summary> /// ALT key /// </summary> ALT_key = 0x12, /// <summary> /// PAUSE key /// </summary> PAUSE_key = 0x13, /// <summary> /// CAPS LOCK key /// </summary> CAPS_LOCK_key = 0x14, /// <summary> /// IME Kana mode /// </summary> IME_Kana_mode = 0x15, /// <summary> /// IME Hanguel mode (maintained for compatibility; use VK_HANGUL) /// </summary> IME_Hanguel_mode = 0x15, /// <summary> /// IME Hangul mode /// </summary> IME_Hangul_mode = 0x15, /// <summary> /// Undefined /// <