首页 >后端开发 >C++ >如何在 C# 中设置全局热键以触发事件,即使我的应用程序未处于焦点状态?

如何在 C# 中设置全局热键以触发事件,即使我的应用程序未处于焦点状态?

Patricia Arquette
Patricia Arquette原创
2025-01-24 05:22:08810浏览

使用C#设置全局热键以触发事件(即使应用程序未处于焦点状态)

本文介绍如何在C#中设置全局热键,即使应用程序不在焦点状态也能触发事件。

问题:

捕获程序未处于焦点状态时的按键(例如,Ctrl Alt J)以触发程序内的事件。

解决方案:

警告:此代码不会在控制台应用程序中触发事件。请使用WinForms项目来实现事件功能。

自定义键盘钩子类:

<code class="language-csharp">public sealed class KeyboardHook : IDisposable
{
    private Window _window = new Window();
    private int _currentId;

    public KeyboardHook()
    {
        // ...
        //  按键事件处理
        // ...
    }

    public void RegisterHotKey(ModifierKeys modifier, Keys key)
    {
        // ...
        // 通过内部原生窗口注册热键
        // ...
    }

    public event EventHandler<KeyPressedEventArgs> KeyPressed;
}</code>

用于事件处理的窗口类:

<code class="language-csharp">private class Window : NativeWindow, IDisposable
{
    // ...
    protected override void WndProc(ref Message m)
    {
        // 处理热键按下
        if (m.Msg == WM_HOTKEY)
        {
            // ...
            // 从LParam中提取修饰符和键
            // ...

            // 触发KeyPressed事件
            KeyPressed?.Invoke(this, new KeyPressedEventArgs(modifier, key));
        }
    }

    // ...
}</code>

使用方法示例:

<code class="language-csharp">public partial class Form1 : Form
{
    private KeyboardHook hook = new KeyboardHook();

    public Form1()
    {
        // ...
        hook.KeyPressed += hook_KeyPressed; //订阅事件
        hook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12);
        // ...
    }

    void hook_KeyPressed(object sender, KeyPressedEventArgs e)
    {
        // 处理按键事件
    }
}</code>

注意:

  • 在使用方法示例中,Control、Alt和F12键组合被注册为热键。
  • 确保使用(ModifierKeys)1(ModifierKeys)2等正确转换修饰键。

How Can I Set Global Hotkeys in C# to Trigger Events Even When My Application Is Not in Focus?

以上是如何在 C# 中设置全局热键以触发事件,即使我的应用程序未处于焦点状态?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn