首页 > 解决方案 > 如何在不使用 Thread.Sleep 的情况下模拟鼠标单击/按键?

问题描述

现在我正在使用 PostMessage 和 MouseClick 将按键发送到应用程序。我想要的是发送 KeyPress,当按键完成时(KeyUp)然后发送鼠标点击。

代码

    const UInt32 WM_KEYDOWN = 0x0100;
    const UInt32 WM_KEYDOWN = 0x0101;
    const int VK_F1 = 0x70;
    const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    const uint MOUSEEVENTF_LEFTUP = 0x0004;

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

    [DllImport("user32.dll")]
    static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);

    private void Timer1_Tick(object sender, EventArgs e)
    {
        Process processes = Process.GetProcessById(_processID);
        PostMessage(processes.MainWindowHandle, WM_KEYDOWN, VK_F1, 0);
        Thread.Sleep(10);
        PostMessage(processes.MainWindowHandle, WM_UP, VK_F1, 0);
        Thread.Sleep(10);
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, UIntPtr.Zero);
        Thread.Sleep(10);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, UIntPtr.Zero);
        Thread.Sleep(10);
    }

此代码有效,但仅在高计时器间隔内有效。当我将计时器减少到 100 或低于此值时,它就像在鼠标单击时冻结并且不再进行按键操作。我想知道的是如何使它在较低的计时器间隔内正常工作。或者它有没有更好的解决方案来完成它。

谢谢你。

标签: c#keypressdllimportmouseclick-eventuser32

解决方案


推荐阅读