C# 如何在系统托盘关闭的windows窗体中捕获热键

C# 如何在系统托盘关闭的windows窗体中捕获热键,c#,.net,visual-studio,C#,.net,Visual Studio,我想知道在Windows窗体最小化到系统托盘时是否可以捕获特定的键。当组合键被触发时,打开某个窗体 我试图捕获的键是:Alt+Prt Sc.当窗体最小化时,可以使用winapi SetWindowsHookEx来捕获热键 请找到program.cs并用它替换以下代码 static class Program { /// <summary> /// The main entry point for the application. /// </summar

我想知道在Windows窗体最小化到系统托盘时是否可以捕获特定的键。当组合键被触发时,打开某个窗体


我试图捕获的键是:Alt+Prt Sc.

当窗体最小化时,可以使用winapi SetWindowsHookEx来捕获热键

请找到program.cs并用它替换以下代码

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        _hookID = SetHook(_proc);
        Application.Run(new Form1());
        UnhookWindowsHookEx(_hookID);
    }

    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int VK_F1 = 0x70;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;
    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)
        {
            Keys number = (Keys)Marshal.ReadInt32(lParam);

            if (number == Keys.PrintScreen)
            {
                if ((wParam == (IntPtr)260 && Keys.Alt == Control.ModifierKeys && number == Keys.PrintScreen))
                {
                    Form2 form = new Form2();
                    form.Show();
                }
            }


        }
        return CallNextHookEx(IntPtr.Zero, 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);
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
_hookID=SetHook(_proc);
Application.Run(新Form1());
unhookwindowshookx(_hookID);
}
专用常量int WH_键盘LL=13;
私有常量int WM_KEYDOWN=0x0100;
私有常量int VK_F1=0x70;
私有静态低层keyboardproc\u proc=HookCallback;
私有静态IntPtr _hookID=IntPtr.Zero;
专用静态IntPtr SetHook(低级键盘程序)
{
使用(Process curProcess=Process.GetCurrentProcess())
使用(ProcessModule curModule=curProcess.MainModule)
{
返回SetWindowsHookEx(WH\u KEYBOARD\u LL,proc,GetModuleHandle(curModule.ModuleName),0);
}
}
私有委托IntPtr低级键盘PROC(int nCode、IntPtr wParam、IntPtr lParam);
专用静态IntPtr钩子回调(int nCode、IntPtr wParam、IntPtr lParam)
{
如果(nCode>=0)
{
密钥编号=(密钥)Marshal.ReadInt32(LPRAM);
if(number==Keys.PrintScreen)
{
if((wParam==(IntPtr)260&&Keys.Alt==Control.ModifierKeys&&number==Keys.PrintScreen))
{
Form2 form=新Form2();
form.Show();
}
}
}
返回CallNextHookEx(IntPtr.Zero、nCode、wParam、lParam);
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr SETWINDOWSHOOKX(int idHook、低层键盘PROC lpfn、IntPtr hMod、uint dwThreadId);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
[返回:Marshallas(UnmanagedType.Bool)]
私有静态外部bool unhookwindowshookx(IntPtr hhk);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr CallNextHookEx(IntPtr hhk、intncode、IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”,CharSet=CharSet.Auto,SetLastError=true)]
私有静态外部IntPtr GetModuleHandle(字符串lpModuleName);
}
测试结果:


全局监控键盘活动需要您连接到Windows Api。我以前也这样做过。这不是很有趣。但这是可行的。您试图覆盖Windows键盘快捷键,而不仅仅是捕获它
Alt+Prt Sc
具有非常特定的功能(拍摄窗口截图),就像
Ctrl+C
一样。如果你劫持了它,用户会非常生气好吧,我刚到家,让我测试一下,并发送一条评论和结果。谢谢,非常感谢!它就像预期的那样工作。我添加了一些额外的修改,以主要形式,我试图打开使用热键,只是为了添加一些香料。再一次,谢谢。