C# 在背景中捕获键盘按键

C# 在背景中捕获键盘按键,c#,winforms,keypress,C#,Winforms,Keypress,我有一个在后台运行的应用程序。每当用户随时按F12时,我必须生成一些事件。所以我需要它来捕捉按键。在我的应用程序中,如果用户在任何时候按下F10,将执行一些事件。我不明白怎么做 有人知道怎么做吗 N:B: 这是一个winforms应用程序。它不需要在我的表格上有焦点。我的主窗口可能仍在系统托盘中,但它仍必须捕获按键。您需要的是一个全局热键 在类的顶部导入所需的库: // DLL libraries used to manage hotkeys [DllImport("user32.dll")]

我有一个在后台运行的应用程序。每当用户随时按F12时,我必须生成一些事件。所以我需要它来捕捉按键。在我的应用程序中,如果用户在任何时候按下F10,将执行一些事件。我不明白怎么做

有人知道怎么做吗

N:B:
这是一个winforms应用程序。它不需要在我的表格上有焦点。我的主窗口可能仍在系统托盘中,但它仍必须捕获按键。

您需要的是一个全局热键

  • 在类的顶部导入所需的库:

    // DLL libraries used to manage hotkeys
    [DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID) {
            // My hotkey has been typed
    
            // Do what you want here
            // ...
        }
        base.WndProc(ref m);
    }
    
  • 在类中添加一个字段,该字段将作为代码中热键的引用:

    const int MYACTION_HOTKEY_ID = 1;
    
  • 注册热键(例如在Windows窗体的构造函数中):

  • 通过在类中添加以下方法来处理键入的键:

    // DLL libraries used to manage hotkeys
    [DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
    [DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID) {
            // My hotkey has been typed
    
            // Do what you want here
            // ...
        }
        base.WndProc(ref m);
    }
    

  • 如果您在运行Otiel的解决方案时遇到问题:

  • 您需要包括:

     using System.Runtime.InteropServices; //required for dll import
    
  • 对于像我这样的新手来说,另一个疑问是:“类的顶端”实际上意味着像这样的类的顶端(不是名称空间或构造函数):

  • 您不需要添加user32.dll作为对项目的引用。WinForms始终自动加载此dll


  • 什么样的申请可能重复?“在后台运行”是什么意思?什么是“随时”(应用程序是否有焦点)?您是否使用表单来执行按键操作?这是一个控制台应用程序吗?它是一个winform应用程序。它不需要聚焦我的窗体。我的主窗口可能在系统托盘中,但它仍然必须捕获按键。@JamesHill:这不是一个副本,因为我们谈论的不是同一种类型的快捷键。另外,我不太喜欢全局热键——我认为它们有潜在的“危险性”。如果两个应用程序注册了相同的密钥呢?如果不小心处理,它可能会产生意想不到的后果。即使您小心地处理您的应用程序,也不能说其他应用程序也会这样做。有点像是一个伟大的司机,但不得不担心路上的其他司机。@WonkotheSane:我完全同意你的看法。这就是为什么(发送给@DarkenShooter的消息)使用全局热键的应用程序应该为用户提供一种自定义其全局热键的方法(如Skype或其他热键)。@WonkotheSane查看注册器热键的MSDN文档,引用:如果为热键指定的击键已被另一个热键注册,则注册器热键将失败。无论如何,我同意Otiel,用户应该能够自定义使用的密钥,另外,F12密钥是Debugger的reserver让我们尝试在windows应用程序的main.cs中注册热键,因为我不希望它具有任何形式,但此.Handle在此上下文中不存在。有没有其他办法?