keybd_event在thread.sleep之后发送

时间:2014-07-12 17:43:32

标签: c# keyboard-hook

我正在使用keybd_event来模拟C#中的Key事件。在这个例子中,我试图发送Windows + D Kombination返回桌面。 以下代码嵌入在按钮单击功能中:

Robot.PressKey(Keys.LWin);
Robot.PressKey(Keys.D);
Thread.Sleep(50);
Robot.ReleaseKey(Keys.D);
Robot.ReleaseKey(Keys.LWin);
Thread.Sleep(1000);

public void PressKey(Keys key)
{

    keybd_event((byte)key, 0, 1, 0);
}

public void ReleaseKey(Keys key)
{
    keybd_event((byte)key, 0, 1|2, 0);
}

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

我的期望:我回到桌面并等待1秒钟。 会发生什么:1秒后我回到桌面。

如果我在Thread.Sleep(1000)之后继续进行更多的函数调用,它永远不会返回到桌面。 我究竟做错了什么?谢谢;)

编辑:我也尝试使用SendInput(从http://damiproductions.darkbb.com/t504-c-sending-keys-with-the-sendinput-api粘贴的副本),但问题相同。我还用Stopwatch和Loop替换了Thread.Sleep()。我的最后一次尝试是在一个新线程中启动它。这对以太没有帮助。

1 个答案:

答案 0 :(得分:1)

问题在于你正在沉睡整个过程。 如果您只想延迟任务,请在您的资料中使用异步方法:

private async void _stuff()
{
Robot.PressKey(Keys.LWin);
Robot.PressKey(Keys.D);
await Task.Delay(50);
Robot.ReleaseKey(Keys.D);
Robot.ReleaseKey(Keys.LWin);
await Task.Delay(1000);
}

以及你拥有它的部分:

Robot.PressKey(Keys.LWin);
Robot.PressKey(Keys.D);
await Task.Delay(50);
Robot.ReleaseKey(Keys.D);
Robot.ReleaseKey(Keys.LWin);
await Task.Delay(1000);

将其更改为:

_stuff();

.Sleep的区别在于您的应用程序在等待并且不会冻结程序时可以执行更多操作:D