在Winforms应用程序(C#)中,Windows键 + [键]快捷键是什么?

3
我有一个运行在系统托盘的应用程序,是否可以让用户通过 Windows 键 + 在 C# 中恢复应用程序?
谢谢。
2个回答

3

是的,可以使用 Windows API。我认为 Windows 键和 Ctrl+Esc 是一样的,但我不确定。

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class InterceptKeys
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(
        int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
        IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}

Windows键和CTRL+ESC是一样的吗?你确定吗? - David Heffernan
2
不确定。我知道如果你按Ctrl+Esc,它的效果与Windows键相同。 - Jaime Oro
你说得对,David。虽然我在维基百科上读到过,但它仍然可以被“捕获”。Mantorok,你应该查看这个链接http://en.wikipedia.org/wiki/Windows_key,因为操作系统已经预留了一些与Windows键相关的组合键。 - Jaime Oro
@Jamie "一些与Windows键组合的组合已被操作系统保留" 你看了我的回答吗?!!它们都被保留了!只是目前有一些动作与它们相关联,但它们全部都被保留 - David Heffernan
@David 嗯,也许我表达得不太好。“我的意思是它们有与之相关联的操作”。一组按键不能被保留。 - Jaime Oro
@Jaime 不,Windows 保留了所有使用 Windows 键的键盘快捷键供自己使用。应用程序不应该使用它们。它还保留了一些其他的快捷键,例如 CTRL+ESC、ALT+ESC、ALT+TAB 等。 - David Heffernan

1

虽然你可以这样做,但你不应该这样做。使用Windows键的快捷方式属于Windows,其他应用程序不应该使用。

事实上,即使是全局系统范围的快捷方式也是一个问题,因为它们很可能与其他应用程序的快捷方式冲突。这就是为什么Windows能够使用与Windows键相关联的系统范围快捷方式的主要原因,因为协议规定它保留这些快捷方式供自己使用,而你的应用程序则避免了冲突。

如果你决定这样做,并且我碰巧遇到你的软件,那么我将会对你深恶痛绝,一生都会记得!


+1:不知道是谁给这个投票负面评价的,但是不要因为你不喜欢信息的内容就攻击传递信息的人。 - Richard
@Richard 确实如此!谢谢。我本来预料会有一些反对票,但我也相当确定 Stack Overflow 上大多数理智的人都会认识到我所说的价值! - David Heffernan
@Jaime 请再读一遍。我没有说“Windows键属于Windows”,我说的是“使用Windows键的快捷方式属于Windows”。 - David Heffernan
@David 你说得对,你没有提到键名,而是使用了它的快捷方式。 - Jaime Oro
@David 好的,但是Manotork无论如何都想做这件事,所以我告诉他该怎么做。希望没问题... - Jaime Oro
显示剩余10条评论

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