0

我需要模拟一些键,这里的代码:

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

private const int KEYEVENTF_EXTENDEDKEY = 1;
private const int KEYEVENTF_KEYUP = 2;

public static void KeyDown(Keys vKey)
{
    keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0);
}

public static void KeyUp(Keys vKey)
{
    keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}

KeyboardSend.KeyDown(Keys.Z);
KeyboardSend.KeyUp(Keys.Z);

但是在一个特定的应用程序中,“KeyUp”方法不起作用并且被按下,直到我按下键盘上的键。

我做错了什么?

4

2 回答 2

1

我在Ryan West的解决方案中看到的唯一变化是,他在和方法的第三个参数中删除了KEYEVENTF_EXTENDEDKEY调用函数的标志,因此在方法中,调用函数的第三个参数是 0,并且在方法上,它只是. 只有很小的变化才能使方法起作用并解决您的问题。keybd_eventKeyDownKeyUpKeyDownkeybd_eventKeyUpKEYEVENTF_KEYUPKeyUp

正确阅读keybd_eventMSDN 站点中的功能,如果您以前阅读过,甚至再次阅读。

它们提供有关该函数及其参数的信息和详细信息。它们还解释了您可以在keybd_event函数的第三个参数中使用的所有标志,尤其是您的问题中的情况KEYEVENTF_EXTENDEDKEY

如果您一次又一次正确阅读,也许您会理解为什么标志会导致您的方法不起作用,以及为什么必须删除该标志才能使您的方法起作用。KEYEVENTF_EXTENDEDKEYKeyUpKeyUp

将来可能还会学习如何正确调用函数,这样您就不会遇到任何问题。keybd_event

于 2014-08-19T22:33:08.307 回答
0

当我将代码更改为以下代码时,它似乎工作得很好。我通过打开记事本,运行程序,然后按住“a”键对其进行了测试。它打印小写3秒,然后开始做大写,然后又回到小写。

public static void KeyDown(Keys vKey)
{
    keybd_event((byte)vKey, 0, 0, 0);
}

public static void KeyUp(Keys vKey)
{
    keybd_event((byte)vKey, 0, KEYEVENTF_KEYUP, 0);
}

System.Threading.Thread.Sleep(3000);
KeyDown(Keys.SHIFT);
System.Threading.Thread.Sleep(4000);
KeyUp(Keys.SHIFT);

尝试查看 Windows 输入模拟器,了解如何模拟按键的一个很好的示例。它是 User32.dll 中 SendInput 函数的开源包装器。

我学到的一件事是,要模拟按住键,通常发送 keydown 是不够的,稍等片刻,然后向上发送键。如果您希望按键像普通键盘一样重复按键,您是否必须继续发送键盘事件并以按键事件结束。

http://inputsimulator.codeplex.com/

于 2013-11-14T14:36:44.227 回答