转载自: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
/// <

本文整理了C#中利用user32.dll库进行模拟按键操作的知识,适合开发自动操作工具和游戏外挂。文章探讨了keybd_event函数的dwFlags参数的含义,并提供了相关代码示例,同时对MapVirtualKey函数的作用提出了疑问。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



