发送Windows键使用SendKeys

42

我正在研究C#中的快捷键。我已经成功地使用SendKeys实现了Ctrl、Alt和Shift。

就像这样:

Ctrl + C:

System.Windows.Forms.SendKeys.SendWait("^c");

或者 Alt + F4

System.Windows.Forms.SendKeys.SendWait("%{F4}");

但我无法使用SendKeys发送"Windows键"。 我尝试了例如:Win + E.SendWait("#e") ,但它不起作用。 我应该使用什么代替“#”?

谢谢。


16
Windows键实际上等同于CTRL + ESC,你试过这样做吗? - Matzi
2
赞同。它是SendSystemKeys "{Ctrl+Esc}"。 - Flot2011
1
是的,我尝试过使用.SendWait("^{ESC}"),但这也不起作用。这个语法中有任何错误的代码吗? - nuriaycan
1
Process.Start("explorer.exe"); - Hans Passant
6
Win + E,只是一个示例。想象一下,我还需要Win + R(运行)或Win + L。 - nuriaycan
5个回答

30

好的,原来你真正需要的是这个:http://inputsimulator.codeplex.com/

它已经完成了将Win32 SendInput方法暴露给C#的所有繁重工作。这使您可以直接发送windows键。这经过测试可行:

InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.VK_E);

但请注意,在某些情况下,您希望特别将该键发送到应用程序(例如ALT+F4),在这种情况下,请使用Form库中的方法。在其他情况下,您希望将其发送到操作系统中,则使用上述方法。


旧版

为了参考,请保留此处,它不适用于所有操作系统,并且不会始终按照您的预期行事。请注意,您正在尝试将这些按键发送到应用程序,而操作系统通常会在早期拦截它们。在Windows 7和Vista的情况下,太早(在发送E之前)。

SendWait("^({ESC}E)")Send("^({ESC}E)")

从这里注意到:http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

要指定同时按下SHIFT,CTRL和ALT的任何组合键,同时按下几个其他键,请将这些键的代码括在括号中。例如,要指定在按下E和C时按住SHIFT,请使用“+(EC)”。要指定在按下E时按住SHIFT,然后在没有SHIFT的情况下按下C,请使用“+EC”。

请注意,由于您想同时按下ESC和(比如)E,因此需要将它们括在括号中。


2
很酷,你的 Gravatar 几乎和 OP 的一模一样。:-P - Patrick
这就是我真正想要的。非常感谢您的回复,非常感激! - nuriaycan
输入模拟器需要您在Excel中引用DLL,对吗? - DeerSpotter
如何发送一个特定窗口的按键?例如,我想将Win键发送到全屏且处于活动状态的应用程序中。它没有按照我需要的方式工作。谢谢! - user3790692
最后维护的分支:https://github.com/GregsStack/InputSimulatorStandard - user12031933

9

nuget package 下载 InputSimulator。

然后编写以下内容:

        var simu = new InputSimulator();
        simu.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.VK_E);

在我的情况下,要创建新的虚拟桌面需要3个按键和以下代码(Windows键+Ctrl+D):

        simu.Keyboard.ModifiedKeyStroke(new[] { VirtualKeyCode.LWIN, VirtualKeyCode.CONTROL }, VirtualKeyCode.VK_D);

有没有想过如何通过Add-Type在PowerShell中使用它? - Rakha
请查看此页面:https://github.com/TChatzigiannakis/InputSimulatorPlus/blob/master/WindowsInput.Tests/InputSimulatorExamples.cs 您可以运行命令,然后在运行中输入任何应用程序名称,然后进行您想要的所有操作。 - Ali Rasouli
1
var sim = new InputSimulator(); sim.Keyboard .ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.VK_R) .Sleep(1000) .TextEntry("notepad") .Sleep(1000) .KeyPress(VirtualKeyCode.RETURN) .Sleep(1000) .TextEntry("这些...") .TextEntry("并在5秒钟内完成。") .Sleep(5000) .ModifiedKeyStroke(VirtualKeyCode.MENU, VirtualKeyCode.SPACE) .KeyPress(VirtualKeyCode.DOWN) .KeyPress(VirtualKeyCode.RETURN); - Ali Rasouli

7

Alt+F4仅在括号中起作用。

SendKeys.SendWait("(%{F4})");

谢谢,非常完美。发现:如果你想发送alt+字母。如果我使用小写字母(例如alt+w,"(%{w})"),它可以正常工作。但是如果我使用大写字母(例如alt+W),Windows窗体会先使用Alt选择窗体菜单栏的第一项,导致键盘组合失效。这是在.Net 4.8上的情况。 - undefined

2
SetForegroundWindow( /* window to gain focus */ );
SendKeys.SendWait("^{ESC}"); // ^{ESC} is code for ctrl + esc which mimics the windows key.

0

发送组合键 Ctrl+Alt+Right ==> 使用此代码 ==> "(^%({RIGHT}))"


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