之前做了一个游戏的辅助程序,其中要利用Windows API 的 keybd_event 函数来模拟键盘按下和弹起空格键。
后来这个游戏不知道用啥办法,使keybd_event模拟按下和弹起空格键不起作用了,但模拟其他按键还管用。
问题是:有没有其他办法,来模拟键盘按下和弹起空格键呢?

解决方案 »

  1.   

    关注一下 
    对Windows API 不太熟悉
      

  2.   

    keybd_event都不行?恐怕其他方法更不行了,试试SendKeys
      

  3.   

    空格键是SendKeys.Send("{BREAK}"); 吗?好像不是这个{BREAK}
    SendKeys.Send(" ")这个没用
      

  4.   

    主要是要分别实现按下和弹起的功能,SendKeys好像不太行
      

  5.   

      SendKeys模拟键盘的操作,设置一定的键值,便可以自动控制。但是我们在使用的过程中,发现SendKeys不支持空格键,在很多的应用场景,都需要使用空格键,所以只好通过反射的方式将其调整。
    代码如下:            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);
      

  6.   

    keybd_event都不行?
    先调用API函数BringWindowToTop,然后再用keybd_event模拟试试
      

  7.   

    [DllImport("user32.dll", EntryPoint = "mouse_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);//回车        }
      

  8.   

    是不是用钩子。把key_event屏掉了。
      

  9.   

    模拟directx input ,最好使用这个
      

  10.   

    1.mouse_event
    2.sendMessage
    3.PostMessage
    4.SendMessageNotify
    5.SendMessageTimeOut
    6.WinIO
      

  11.   


    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);这段看不懂啊,哪位高手能解释一下?或者手动按下空格键一段时间后,程序自动屏蔽键盘的空格键输入,这个如何做到呢?
      

  12.   

      
        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
      

  13.   

    先获取窗口句柄iptr
    SendMessage(iptr, WM_KEYDOWN , VK_SPACE , 0);
      

  14.   

    System.Diagnostics.Process[] GamesProcess = System.Diagnostics.Process.GetProcessesByName("notepad");
    if (GamesProcess.Length == 0) return;
    hWnd = GamesProcess[0].Handle;SendMessage(hWnd, WM_KEYDOWN, VK_SPACE, 0);
    SendMessage(hWnd, WM_KEYUP, VK_SPACE, 0);这样写,并没有在一个打开的记事本里写入空格啊,是哪里错了?