9

基本上我想在代码中模拟用户点击 windows 键。我知道有 SendKeys 如果我得到它们的句柄,它允许我将按键发送到 Windows,但我不知道我需要处理什么才能发送 Windows 键命令。例如,Windows 键 + L。稍加阅读后,似乎 CTRL-ESC 也应该弹出“开始”菜单,但不确定如何告诉它将键发送到 Windows(如果这甚至可能的话)。任何帮助将非常感激。

干杯!

4

4 回答 4

9

我不认为你可以使用 SendKeys 来做到这一点,你需要 p/invoke 到一个 API 函数,可能是keybd_event 来发送 CTRL+ESC 或 Windows 键。

是在 VB 中以这种方式打开开始菜单的示例,这里是在 pinvoke.net 上带有 C# 签名的 keybd_event。

于 2009-09-17T08:39:10.420 回答
5

用户可以通过 WinKey 快捷方式执行的某些操作可以通过其他方式以编程方式完成。以 WinKey+L 为例,您可以改用以下语句:

Process.Start("rundll32.exe", "user32.dll,LockWorkStation");

如果您可以详细说明您要完成的工作,也许有比 keybd_event 更好的方法(正如 Dale 所建议的那样)。

于 2009-09-27T18:24:28.527 回答
0

我已经使用了 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);
于 2021-07-06T11:37:18.550 回答
-2

您需要使用全局键盘挂钩来挂钩应用程序外部的键盘。这里有一篇关于如何做到这一点的文章。

于 2009-09-17T08:36:08.183 回答