如何模拟按键操作

6

我知道如何使用SendKeys()函数,但如果我想模拟按住ESC键大约5秒钟怎么办?


1
只是出于好奇,我能理解从用户输入中检测这样的事件的必要性,但为什么要在程序中模拟它呢? - Mehdi LAMRANI
2个回答

14
您可以使用 PInvoke 调用 keybd_event,并按住 Escape 键 5 秒钟,然后释放它:
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);


keybd_event(VK_ESCAPE, 0, 0, 0) // KEY_DOWN

System.Threading.Thread.Sleep(5000);

keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0) // KEY_UP

如何在我的项目中使用/添加VK_ESCAPE和KEYEVENTF_KEYUP? - Jason94
const int VK_ESCAPE = 27; const int KEYEVENTF_KEYUP = 2; 常量整数VK_ESCAPE等于27; 常量整数KEYEVENTF_KEYUP等于2; - fardjad
嗯...看看这个:http://api.farmanager.com/en/winapi/virtualkeycodes.html - fardjad
我正在进行一些测试,如果我将VK_ESCAPE替换为VK_A,那么如果我让它睡眠X秒钟,文本字段中应该会显示“aaaaaaaaaa”,是吗?但我只能一次输入一个字母(在使用计时器循环进行测试)。你使用的是KEYEVENTF_KEYUP = 0x02对吧? - Jason94
KEYEVENTF_KEYUP 应该是 2 或者 0x02。如果你在按住 A 的时候将应用程序线程休眠,那么它将不会响应 keybd_event(因此在你的应用程序中只会写入一个 A)。可以使用定时器或创建另一个线程来解决。 - fardjad

-2
尝试使用计时器...使用System.Forms.Timer...设置为5000毫秒...然后如果5000毫秒已经完成,关闭计时器。

请再次阅读问题,这不是关于读取长按键,而是关于发送长按键。 - Gerrie Schenck
1
我猜他想以编程方式生成类似于“KeyDown”的事件,并在5秒后生成一个“KeyUp”事件,而不是发送一个KeyPress并等待5秒... - digEmAll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接