模拟按键X秒

Joh*_*han 6 c# winforms

这是我用来在某个过程中模拟tab-keypress的代码:

[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

public Form1()
{
    PostMessage(MemoryHandler.GetMainWindowHandle(), 
               (int)KeyCodes.WMessages.WM_KEYDOWN, 
               (int)KeyCodes.VKeys.VK_TAB, 0);

    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法扩展它,以便按下(例如)1秒的键,而不是只是点击它?

请注意,我对Thread.Sleep()阻止UI线程的解决方案不感兴趣.

Han*_*ant 6

按住键时重复按键是键盘控制器内置的功能.键盘内置的微处理器.在8042微控制器是传统的选择,键盘设备驱动程序仍然带有它的名字.

所以,不,这不是由Windows完成的,PostMessage()不会为你做.不完全是一个问题,您可以使用Timer模拟它.


小智 0

不确定您对 PostMessage 做了什么,但从这里修改了一些代码: SendKey.Send() 不起作用

   [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    public static void PressKey(Keys key, bool up)
    {
        const int KEYEVENTF_EXTENDEDKEY = 0x1;
        const int KEYEVENTF_KEYUP = 0x2;
        if (up)
        {
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
        }
        else
        {
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
        }
    }

    void TestProc()
    {
        PressKey(Keys.Tab, false);
        Thread.Sleep(1000);
        PressKey(Keys.Tab, true);
    }
Run Code Online (Sandbox Code Playgroud)

也许这对你有用。只需按下一个键,然后按下一个键,中间有一个睡眠。您甚至可以进一步添加并传递您希望按键保持按下状态的时间值。