簡體   English   中英

如何以編程方式模擬按鈕按下?

[英]How to programatically simulate a button press?

如何模擬.NET中的按鈕按下?

我可以輕松使用AutoHotKey來做到這一點:

#Persistent
SetTimer,PressTheKey,1000
Return

PressTheKey:
Send, {F5}
Return

任何應用程序都知道按鈕被按下(就像我按下按鈕一樣)。 我嘗試用以下方法做同樣的事情:

[DllImport("user32.dll", SetLastError = true)]
public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

要么:

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

或使用Windows輸入模擬器( https://inputsimulator.codeplex.com/ ):

inputSimulator.Keyboard.KeyDown(VirtualKeyCode.VK_H)

他們都在記事本或其他應用程序中工作,但從未在我的全屏游戲中工作。 知道如何實現嗎? 我想要一個在系統級別全局模擬點擊的解決方案。

那里有一個名為Interceptor的庫,它是Windows鍵盤驅動程序的包裝,但是有一些限制-即不支持win8或更高版本-並且似乎已經停止工作了(11個月前)。 看看是否適合您的需求。

我在某處讀到有一些方法可以通過DirectInput API來完成-我不確定是否是這種情況。 我使用過Interceptor幾次,當時它可以滿足我的需求。

希望這可以幫助

鏈接

編輯:固定鏈接

我了解到我的應用程序正在使用DirectInput(感謝Gabe)。 這使我更加專注於SendInput,並且設法將“ A”鍵發送到應用程序,如下所示:

// A = 30
keyboardDirectInput.Press(30);

所有關鍵代碼均在此處提供: https : //msdn.microsoft.com/zh-cn/library/windows/desktop/bb321074%28v=vs.85%29.aspx

KeyboardDirectInput類:

public class KeyboardDirectInput
{
    [DllImport("user32.dll")]
    static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);

    public void Press(VirtualKeys key)
    {
        INPUT[] InputData = new INPUT[2];

        InputData[0].type = (int)InputType.INPUT_KEYBOARD;
        InputData[0].ki.wScan = (short)key;
        InputData[0].ki.dwFlags = (int)KEYEVENTF.SCANCODE;

        InputData[1].type = (int)InputType.INPUT_KEYBOARD;
        InputData[1].ki.wScan = (short)key;
        InputData[1].ki.dwFlags = (int)(KEYEVENTF.KEYUP | KEYEVENTF.SCANCODE);

        if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
        {
            Logger.GetInstance().Warn("SendInput failed (CODE {0})", Marshal.GetLastWin32Error());
        }
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct INPUT
    {
        [FieldOffset(4)]
        public HARDWAREINPUT hi;
        [FieldOffset(4)]
        public KEYBDINPUT ki;
        [FieldOffset(4)]
        public MOUSEINPUT mi;
        [FieldOffset(0)]
        public int type;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public int mouseData;
        public int dwFlags;
        public int time;
        public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public short wVk;
        public short wScan;
        public int dwFlags;
        public int time;
        public IntPtr dwExtraInfo;
    }

    [Flags]
    public enum KEYEVENTF
    {
        KEYDOWN = 0,
        EXTENDEDKEY = 0x0001,
        KEYUP = 0x0002,
        UNICODE = 0x0004,
        SCANCODE = 0x0008,
    }

    [Flags]
    public enum InputType
    {
        INPUT_MOUSE = 0,
        INPUT_KEYBOARD = 1,
        INPUT_HARDWARE = 2
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM