如何从当前 .NET 表单/应用程序发送按键 F12

发布于 2024-07-11 20:20:46 字数 187 浏览 6 评论 0原文

我非常确定以下按钮激活的表单代码应该在我的 C# 应用程序中引发 Control-F12:

SendKeys("^{F12}");

但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序。 我的键盘可以用。 看起来发送键在某处被拦截,并且没有以实际模拟击键的方式发送。 有什么帮助吗?

I am pretty sure the following button-activated form code should raise a Control-F12 in my C# application:

SendKeys("^{F12}");

But it does not appear to go on up to the windows shell and activate another program that is listening for it. My keyboard does work. It seems like the sendkeys is getting intercepted somewhere and not sent on in a way that actually simulates the key stroke. Any help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

混吃等死 2024-07-18 20:20:46

SendKeys 无法在活动应用程序之外发送密钥。

要真正模拟系统范围内的击键,您需要从 user32.dll 中 P/Invoke keybd_eventSendInput。 (根据 MSDN SendInput 是“正确”的方式,但 keybd_event 可以工作并且更易于 P/Invoke。)

示例(我认为这些键代码是正确的...每对中的第一个是 VK_ 代码,第二个是接通或断开键盘扫描代码...“2”是 KEYEVENTF_KEYUP )

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

...

keybd_event(0xa2, 0x1d, 0, 0); // Press Left CTRL
keybd_event(0x7b, 0x58, 0, 0); // Press F12
keybd_event(0x7b, 0xd8, 2, 0); // Release F12
keybd_event(0xa2, 0x9d, 2, 0); // Release Left CTRL

另一种方法是在使用 SendKeys 之前激活您要发送到的应用程序。 为此,您需要再次使用 P/Invoke 来查找应用程序的窗口并将其聚焦。

SendKeys is not capable of sending keys outside of the active application.

To really and truly simulate a keystroke systemwide, you need to P/Invoke either keybd_event or SendInput out of user32.dll. (According to MSDN SendInput is the "correct" way but keybd_event works and is simpler to P/Invoke.)

Example (I think these key codes are right... the first in each pair is the VK_ code, and the second is the make or break keyboard scan code... the "2" is KEYEVENTF_KEYUP)

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

...

keybd_event(0xa2, 0x1d, 0, 0); // Press Left CTRL
keybd_event(0x7b, 0x58, 0, 0); // Press F12
keybd_event(0x7b, 0xd8, 2, 0); // Release F12
keybd_event(0xa2, 0x9d, 2, 0); // Release Left CTRL

The alternative is to activate the application you're sending to before using SendKeys. To do this, you'd need to again use P/Invoke to find the application's window and focus it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文