基本上我想在代码中模拟用户点击 windows 键。我知道有 SendKeys 如果我得到它们的句柄,它允许我将按键发送到 Windows,但我不知道我需要处理什么才能发送 Windows 键命令。例如,Windows 键 + L。稍加阅读后,似乎 CTRL-ESC 也应该弹出“开始”菜单,但不确定如何告诉它将键发送到 Windows(如果这甚至可能的话)。任何帮助将非常感激。
干杯!
我不认为你可以使用 SendKeys 来做到这一点,你需要 p/invoke 到一个 API 函数,可能是keybd_event 来发送 CTRL+ESC 或 Windows 键。
这是在 VB 中以这种方式打开开始菜单的示例,这里是在 pinvoke.net 上带有 C# 签名的 keybd_event。
用户可以通过 WinKey 快捷方式执行的某些操作可以通过其他方式以编程方式完成。以 WinKey+L 为例,您可以改用以下语句:
Process.Start("rundll32.exe", "user32.dll,LockWorkStation");
如果您可以详细说明您要完成的工作,也许有比 keybd_event 更好的方法(正如 Dale 所建议的那样)。
我已经使用了 user703016 在这里提供的类并且工作正常!
参考:
using System.Runtime.InteropServices;
using System.Windows.Forms;
static class KeyboardSend
{
[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.LWin);
KeyboardSend.KeyDown(Keys.D4);
KeyboardSend.KeyUp(Keys.LWin);
KeyboardSend.KeyUp(Keys.D4);
您需要使用全局键盘挂钩来挂钩应用程序外部的键盘。这里有一篇关于如何做到这一点的文章。