向游戏(全屏)-应用程序发送密钥

时间:2019-03-25 22:34:08

标签: c# keyboard directx

我使用以下代码将击键发送到Windows:

[DllImport("user32.dll", SetLastError = true)]
private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag 
public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag 
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)key, 0, KEYEVENTF_KEYUP, 0);

“键”可以是任何键码。简单的字符,例如字符或功能键等。

这在“简单”应用程序中可以正常工作。例如,如果我打开NotePad ++,并且我的程序在后台运行,那么一切都会按需运行。

但是当我打开全屏游戏(例如Pinball FX)时,似乎没有收到按键。

我希望DirectX或类似的东西是这里的问题。还有另一种发送密钥的方式吗?也许通过SharpDX?

1 个答案:

答案 0 :(得分:0)

我设法通过使用另一种使用DirectInput的方法来解决此问题,如下所述:https://www.codeproject.com/questions/279641/c-sharp-directinput-send-key

[DllImport("user32.dll", SetLastError = true)]
        private static extern uint SendInput(uint numberOfInputs, INPUT[] inputs, int sizeOfInputStructure);

        private static void SendKeyDown(ushort keyCode)
        {
            var input = new KEYBDINPUT
            {
                Vk = keyCode
            };

            SendKeyboardInput(input);
        }

        private static void SendKeyUp(ushort keyCode)
        {
            var input = new KEYBDINPUT
            {
                Vk = keyCode,
                Flags = 2
            };
            SendKeyboardInput(input);
        }

        private static void SendKeyboardInput(KEYBDINPUT keybInput)
        {
            INPUT input = new INPUT
            {
                Type = 1
            };
            input.Data.Keyboard = keybInput;

            if (SendInput(1, new[] { input }, Marshal.SizeOf(typeof(INPUT))) == 0)
            {
                throw new Exception();
            }
        }