【问题标题】:keybd_event is send after thread.sleepkeybd_event 在 thread.sleep 之后发送
【发布时间】:2014-07-12 17:43:31
【问题描述】:

我正在使用 keybd_event 来模拟 C# 中的按键事件。在此示例中,我尝试发送 Windows+D 组合以返回桌面。 以下代码嵌入在按钮点击函数中:

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 粘贴复制),同样的问题。我还用秒表和循环替换了 Thread.Sleep()。我最后一次尝试是在一个新线程中启动它。这对以太没有帮助。

【问题讨论】:

  • Never Sleep() 在事件中。
  • 那么,有没有更好的方法让返回桌面后等待1秒呢?我试过带循环的秒表,但它对我没有任何改变
  • 不,也不要循环(长时间)。你现在知道正确的问题,谷歌它。在这里被问了数百次。

标签: c# keyboard-hook


【解决方案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

【讨论】:

  • 非常感谢!这会导致其他问题,但我认为我能够处理它们;)
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多