Simulating Keyboard with SendInput API in DirectInput applications

前端 未结 2 2037
独厮守ぢ
独厮守ぢ 2020-11-28 09:07

I\'m trying to simulate keyboard commands for a custom game controller application. Because I\'ll need to simulate commands in a DirectInput environment most of the usual m

相关标签:
2条回答
  • 2020-11-28 09:20

    I've found the solution to my own problem. So, I thought I'd post here to help anyone who may have similar issues in the future.

    The keyup command was not working properly because when only sending the scan code, the keyup must be OR'ed with the scan code flag (effectively enabling both flags) to tell the SendInput() API that this is a both a KEYUP and a SCANCODE command.

    For instance, the following code will properly issue a scan code key-up:

    INPUT[] InputData = new INPUT[1];
    
    InputData[0].Type = (UInt32)InputType.KEYBOARD;
    //InputData[0].Vk = (ushort)DirectInputKeyScanCode;  //Virtual key is ignored when sending scan code
    InputData[0].Scan = (ushort)DirectInputKeyScanCode;
    InputData[0].Flags = (uint)KeyboardFlag.KEYUP | (uint)KeyboardFlag.SCANCODE;
    InputData[0].Time = 0;
    InputData[0].ExtraInfo = IntPtr.Zero;
    
    // Send Keyup flag "OR"ed with Scancode flag for keyup to work properly
    SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)))
    

    Thanks to Hans for the response. I did some investigating and sending two messages back to back like the original example does indeed simulate a "keypress" but it's very fast. It would not work well for a movement command, but would be ideal when action keys are to be "tapped" and not held down.

    Also, the virtual key field is ignored when sending a scan code. MSDN had the following to say on the subject:

    "Set the KEYEVENTF_SCANCODE flag to define keyboard input in terms of the scan code. This is useful to simulate a physical keystroke regardless of which keyboard is currently being used. The virtual key value of a key may alter depending on the current keyboard layout or what other keys were pressed, but the scan code will always be the same."

    http://msdn.microsoft.com/en-us/library/ms646271%28v=VS.85%29.aspx

    0 讨论(0)
  • 2020-11-28 09:40

    I was trying to simulate keyboards for a presentation in Flash, and was also having the same problem. It did work for apps like Notepad, but not for flash. After hours of googling I finally made it work:

    public static void GenerateKey(int vk, bool bExtended)
        {
            INPUT[] inputs = new INPUT[1];
            inputs[0].type = INPUT_KEYBOARD;
    
            KEYBDINPUT  kb = new KEYBDINPUT(); //{0};
            // generate down 
            if ( bExtended )
                kb.dwFlags  = KEYEVENTF_EXTENDEDKEY;
    
            kb.wVk  = (ushort)vk;  
            inputs[0].ki = kb;
            SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0]));
    
            // generate up 
            //ZeroMemory(&kb, sizeof(KEYBDINPUT));
            //ZeroMemory(&inputs,sizeof(inputs));
            kb.dwFlags  =  KEYEVENTF_KEYUP;
            if ( bExtended )
                kb.dwFlags  |= KEYEVENTF_EXTENDEDKEY;
    
            kb.wVk    =  (ushort)vk;
            inputs[0].type =  INPUT_KEYBOARD;
            inputs[0].ki  =  kb;
            SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0]));
        }
    
    0 讨论(0)
提交回复
热议问题