之前做了一个游戏的辅助程序,其中要利用Windows API 的 keybd_event 函数来模拟键盘按下和弹起空格键。
后来这个游戏不知道用啥办法,使keybd_event模拟按下和弹起空格键不起作用了,但模拟其他按键还管用。
问题是:有没有其他办法,来模拟键盘按下和弹起空格键呢?
后来这个游戏不知道用啥办法,使keybd_event模拟按下和弹起空格键不起作用了,但模拟其他按键还管用。
问题是:有没有其他办法,来模拟键盘按下和弹起空格键呢?
对Windows API 不太熟悉
SendKeys.Send(" ")这个没用
代码如下: Type typeForKeywords = Type.GetType("System.Windows.Forms.SendKeys+KeywordVk[], System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Type typeForKeywordItem = Type.GetType("System.Windows.Forms.SendKeys+KeywordVk, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
object objNewKey = Activator.CreateInstance(typeForKeywordItem, "SPACE", 0x20); Type typeForSendKeys = typeof(SendKeys); FieldInfo fieldForkeywords = typeForSendKeys.GetField("keywords", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Static);
object objKeys = fieldForkeywords.GetValue(null);
Type typeForlistForKeyword = Type.GetType("System.Collections.Generic.List`1[[System.Windows.Forms.SendKeys+KeywordVk, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
object objForTmpKeyWords = Activator.CreateInstance(typeForlistForKeyword); MethodInfo mi = typeForlistForKeyword.GetMethod("Add"); foreach (object var in (Array)objKeys)
{
//list.Add(var);
mi.Invoke(objForTmpKeyWords, new object[] { var });
} //list.Add(key);
mi.Invoke(objForTmpKeyWords, new object[] { objNewKey }); mi = typeForlistForKeyword.GetMethod("ToArray");
object objArray = mi.Invoke(objForTmpKeyWords, null);
fieldForkeywords.SetValue(null, objArray);
先调用API函数BringWindowToTop,然后再用keybd_event模拟试试
public static extern void mouse_event(
int dwFlags,
int dx,
int dy,
int cButtons,
int dwExtraInfo
); [DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(
byte bVk,
byte bScan,
int dwFlags,
int dwExtraInfo
); const int MOUSEEVENTF_MOVE = 0x0001; //移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEUP = 0x0040;// 模拟鼠标中键抬起
const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标 public Form1()
{
InitializeComponent(); int X = 100;
int Y = 100; mouse_event( MOUSEEVENTF_RIGHTDOWN, X , Y , 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, X , Y, 0, 0); X += 10;
Y += 65;
mouse_event(MOUSEEVENTF_MOVE, X, Y , 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y , 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, X, Y , 0, 0); keybd_event(65, 0, 0, 0);//a
keybd_event(66, 0, 1, 0);//b
keybd_event(13, 0, 0, 0);//回车 }
2.sendMessage
3.PostMessage
4.SendMessageNotify
5.SendMessageTimeOut
6.WinIO
Type typeForKeywords = Type.GetType("System.Windows.Forms.SendKeys+KeywordVk[], System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Type typeForKeywordItem = Type.GetType("System.Windows.Forms.SendKeys+KeywordVk, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
object objNewKey = Activator.CreateInstance(typeForKeywordItem, "SPACE", 0x20);Type typeForSendKeys = typeof(SendKeys);FieldInfo fieldForkeywords = typeForSendKeys.GetField("keywords", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Static);
object objKeys = fieldForkeywords.GetValue(null);
Type typeForlistForKeyword = Type.GetType("System.Collections.Generic.List`1[[System.Windows.Forms.SendKeys+KeywordVk, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
object objForTmpKeyWords = Activator.CreateInstance(typeForlistForKeyword);MethodInfo mi = typeForlistForKeyword.GetMethod("Add");foreach (object var in (Array)objKeys)
{
//list.Add(var);
mi.Invoke(objForTmpKeyWords, new object[] { var });
}//list.Add(key);
mi.Invoke(objForTmpKeyWords, new object[] { objNewKey });mi = typeForlistForKeyword.GetMethod("ToArray");
object objArray = mi.Invoke(objForTmpKeyWords, null);
fieldForkeywords.SetValue(null, objArray);这段看不懂啊,哪位高手能解释一下?或者手动按下空格键一段时间后,程序自动屏蔽键盘的空格键输入,这个如何做到呢?
public sealed class API
{
//wMsg参数常量值:
//WM_KEYDOWN 按下一个键
public static int WM_KEYDOWN = 0x0100;
//释放一个键
public static int WM_KEYUP = 0x0101;
//按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
public static int WM_CHAR = 0x102; [DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
}
//Windows 使用的256个虚拟键码
public const int VK_LBUTTON = 0x1
public const int VK_RBUTTON = 0x2
public const int VK_CANCEL = 0x3
public const int VK_MBUTTON = 0x4
public const int VK_BACK = 0x8
public const int VK_TAB = 0x9
public const int VK_CLEAR = 0xC
public const int VK_RETURN = 0xD
public const int VK_SHIFT = 0x10
public const int VK_CONTROL = 0x11
public const int VK_MENU = 0x12
public const int VK_PAUSE = 0x13
public const int VK_CAPITAL = 0x14
public const int VK_ESCAPE = 0x1B
public const int VK_SPACE = 0x20
public const int VK_PRIOR = 0x21
public const int VK_NEXT = 0x22
public const int VK_END = 0x23
public const int VK_HOME = 0x24
public const int VK_LEFT = 0x25
public const int VK_UP = 0x26
public const int VK_RIGHT = 0x27
public const int VK_DOWN = 0x28
public const int VK_Select = 0x29
public const int VK_PRINT = 0x2A
public const int VK_EXECUTE = 0x2B
public const int VK_SNAPSHOT = 0x2C
public const int VK_Insert = 0x2D
public const int VK_Delete = 0x2E
public const int VK_HELP = 0x2F
public const int VK_0 = 0x30
public const int VK_1 = 0x31
public const int VK_2 = 0x32
public const int VK_3 = 0x33
public const int VK_4 = 0x34
public const int VK_5 = 0x35
public const int VK_6 = 0x36
public const int VK_7 = 0x37
public const int VK_8 = 0x38
public const int VK_9 = 0x39
public const int VK_A = 0x41
public const int VK_B = 0x42
public const int VK_C = 0x43
public const int VK_D = 0x44
public const int VK_E = 0x45
public const int VK_F = 0x46
public const int VK_G = 0x47
public const int VK_H = 0x48
public const int VK_I = 0x49
public const int VK_J = 0x4A
public const int VK_K = 0x4B
public const int VK_L = 0x4C
public const int VK_M = 0x4D
public const int VK_N = 0x4E
public const int VK_O = 0x4F
public const int VK_P = 0x50
public const int VK_Q = 0x51
public const int VK_R = 0x52
public const int VK_S = 0x53
public const int VK_T = 0x54
public const int VK_U = 0x55
public const int VK_V = 0x56
public const int VK_W = 0x57
public const int VK_X = 0x58
public const int VK_Y = 0x59
public const int VK_Z = 0x5A
public const int VK_STARTKEY = 0x5B
public const int VK_CONTEXTKEY = 0x5D
public const int VK_NUMPAD0 = 0x60
public const int VK_NUMPAD1 = 0x61
public const int VK_NUMPAD2 = 0x62
public const int VK_NUMPAD3 = 0x63
public const int VK_NUMPAD4 = 0x64
public const int VK_NUMPAD5 = 0x65
public const int VK_NUMPAD6 = 0x66
public const int VK_NUMPAD7 = 0x67
public const int VK_NUMPAD8 = 0x68
public const int VK_NUMPAD9 = 0x69
public const int VK_MULTIPLY = 0x6A
public const int VK_ADD = 0x6B
public const int VK_SEPARATOR = 0x6C
public const int VK_SUBTRACT = 0x6D
public const int VK_DECIMAL = 0x6E
public const int VK_DIVIDE = 0x6F
public const int VK_F1 = 0x70
public const int VK_F2 = 0x71
public const int VK_F3 = 0x72
public const int VK_F4 = 0x73
public const int VK_F5 = 0x74
public const int VK_F6 = 0x75
public const int VK_F7 = 0x76
public const int VK_F8 = 0x77
public const int VK_F9 = 0x78
public const int VK_F10 = 0x79
public const int VK_F11 = 0x7A
public const int VK_F12 = 0x7B
public const int VK_F13 = 0x7C
public const int VK_F14 = 0x7D
public const int VK_F15 = 0x7E
public const int VK_F16 = 0x7F
public const int VK_F17 = 0x80
public const int VK_F18 = 0x81
public const int VK_F19 = 0x82
public const int VK_F20 = 0x83
public const int VK_F21 = 0x84
public const int VK_F22 = 0x85
public const int VK_F23 = 0x86
public const int VK_F24 = 0x87
public const int VK_NUMLOCK = 0x90
public const int VK_OEM_SCROLL = 0x91
public const int VK_OEM_1 = 0xBA
public const int VK_OEM_PLUS = 0xBB
public const int VK_OEM_COMMA = 0xBC
public const int VK_OEM_MINUS = 0xBD
public const int VK_OEM_PERIOD = 0xBE
public const int VK_OEM_2 = 0xBF
public const int VK_OEM_3 = 0xC0
public const int VK_OEM_4 = 0xDB
public const int VK_OEM_5 = 0xDC
public const int VK_OEM_6 = 0xDD
public const int VK_OEM_7 = 0xDE
public const int VK_OEM_8 = 0xDF
public const int VK_ICO_F17 = 0xE0
public const int VK_ICO_F18 = 0xE1
public const int VK_OEM102 = 0xE2
public const int VK_ICO_HELP = 0xE3
public const int VK_ICO_00 = 0xE4
public const int VK_ICO_CLEAR = 0xE6
public const int VK_OEM_RESET = 0xE9
public const int VK_OEM_JUMP = 0xEA
public const int VK_OEM_PA1 = 0xEB
public const int VK_OEM_PA2 = 0xEC
public const int VK_OEM_PA3 = 0xED
public const int VK_OEM_WSCTRL = 0xEE
public const int VK_OEM_CUSEL = 0xEF
public const int VK_OEM_ATTN = 0xF0
public const int VK_OEM_FINNISH = 0xF1
public const int VK_OEM_COPY = 0xF2
public const int VK_OEM_AUTO = 0xF3
public const int VK_OEM_ENLW = 0xF4
public const int VK_OEM_BACKTAB = 0xF5
public const int VK_ATTN = 0xF6
public const int VK_CRSEL = 0xF7
public const int VK_EXSEL = 0xF8
public const int VK_EREOF = 0xF9
public const int VK_PLAY = 0xFA
public const int VK_ZOOM = 0xFB
public const int VK_NONAME = 0xFC
public const int VK_PA1 = 0xFD
public const int VK_OEM_CLEAR = 0xFE
SendMessage(iptr, WM_KEYDOWN , VK_SPACE , 0);
if (GamesProcess.Length == 0) return;
hWnd = GamesProcess[0].Handle;SendMessage(hWnd, WM_KEYDOWN, VK_SPACE, 0);
SendMessage(hWnd, WM_KEYUP, VK_SPACE, 0);这样写,并没有在一个打开的记事本里写入空格啊,是哪里错了?