如何发送 Control + A + B 键?(保持按下 Control 修改键)

6
当我记录这个序列时,它失败了。我知道我可以使用Keyboard.SendKeys(control, "A",ModifierKeys.Control)发送Control + A,但是如何发送一个控制序列并在按下下一个字母之前释放该字母?
注意:我要查找的序列类似于注释一行的默认Visual Studio快捷方式Control + K + C
这可能是我需要使用WinApi来完成的事情吗?

1
“恶作剧问题!”在这种特殊情况下,修改器不需要保持按下状态 :) 尝试在VS中使用Ctrl+K Ctrl+C。然而,我可以想象有些情况下释放控制键会触发事件/重置,因此这仍然是一个有效的问题... - user166390
显然,Visual Studio接受任意版本。我猜想那只是习惯性地按下控制键。我需要获取 control_down a_down, a_up, b_down, control_up b_up。 - stoj
5个回答

7
据我所了解,在SendKeys.Send文档中所述,应该是这样的:
SendKeys.Send("^(KC)")

以下内容可以在备注中找到:

如果要指定在按下其他多个键时应按住SHIFT、CTRL和ALT的任意组合,请将这些键的代码括在括号中。例如,要指定在按下E和C时按住SHIFT,请使用“+(EC)”。要指定按下E后按C且不按SHIFT,请使用“+EC”。


请查看此链接:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.send.aspx。 请注意备注部分。 - TCS

4

keybd_event非常方便(比“替代”SendInput更易于使用)。

keybd_event(Keys.Control, MapVirtualKey(Keys.Control, 0), 0, 0);
keybd_event(Keys.A, MapVirtualKey(Keys.A, 0), 0, 0);
keybd_event(Keys.A, MapVirtualKey(Keys.A, 0), KEYEVENTF_KEYUP, 0);
keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), 0, 0);
keybd_event(Keys.B, MapVirtualKey(Keys.B, 0), KEYEVENTF_KEYUP, 0);
keybd_event(Keys.Control, MapVirtualKey(Keys.Control, 0), KEYEVENTF_KEYUP, 0);

如果你只需要按住控制键、alt键和/或shift键,请查看TCS的SendKeys.Send答案keybd_event更强大,可以让你按住任何键,并以任何顺序释放。

我会选择在C++中使用keybd_event()(通常我都这么做),但在C#中,这意味着你需要p/invoke,并且你没有.h文件中的“VK_”#定义。在大多数情况下,在C#中使用SendKeys更容易,但总的来说,keybd_event()更加灵活... - TCS
@TCS:你可以使用 System.Windows.Forms.Keys,因为文档中写道:“高阶位包含键码(与 Windows 虚拟键码相同)”。 - Ben Voigt

1

只使用怎么样?

Keyboard.SendKeys(control, "A",ModifierKeys.Control); 
Keyboard.SendKeys(control, "B",ModifierKeys.Control); 

?


2
我相信在VS的情况下应该可以工作,但有些应用程序可能会在“键弹起”时重置序列... - user166390
我正在处理的应用程序在释放控制键时循环。 - stoj

1
这对我有用:

Keyboard.SendKeys("^(AB)"); 

0

只需像下面这样使用代码:

Keyboard.SendKeys("^AB"); 

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