> 백엔드 개발 > C++ > 응용 프로그램에 초점이 없는 경우에도 응용 프로그램 이벤트를 트리거하도록 C#에서 전역 단축키를 설정하려면 어떻게 해야 합니까?

응용 프로그램에 초점이 없는 경우에도 응용 프로그램 이벤트를 트리거하도록 C#에서 전역 단축키를 설정하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2025-01-24 05:41:09
원래의
103명이 탐색했습니다.

이 C# 코드는 애플리케이션이 최소화되거나 초점이 맞지 않는 경우에도 이벤트를 트리거하는 전역 단축키를 생성합니다. 이해를 돕기 위해 설명과 코드 명확성을 개선해 보겠습니다.

How can I set global hotkeys in C# to trigger application events even when the application is not in focus?

C#에서 전역 단축키 만들기

이 문서에서는 애플리케이션 초점에 관계없이 키보드 단축키에 응답하기 위해 C#에서 전역 단축키를 구현하는 방법을 보여줍니다. Ctrl Alt J와 같은 조합을 등록하고 처리하는 데 중점을 둘 것입니다.

해결책: user32.dll

사용

이를 달성하는 열쇠는 user32.dll 라이브러리, 특히 RegisterHotKeyUnregisterHotKey 함수에 있습니다. 이러한 함수에는 창 핸들이 필요합니다. 따라서 이 솔루션은 Windows Forms 애플리케이션(WinForms)에 가장 적합합니다. 콘솔 애플리케이션에는 필요한 창 컨텍스트가 부족합니다.

코드 구현:

아래의 개선된 코드는 가독성을 높이고 포괄적인 설명을 포함합니다.

<code class="language-csharp">using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public sealed class GlobalHotkey : IDisposable
{
    // Import necessary functions from user32.dll
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private const int WM_HOTKEY = 0x0312; // Windows message for hotkey events

    private readonly NativeWindow _window; // Internal window for message handling
    private int _hotKeyId; // Unique ID for each registered hotkey

    public GlobalHotkey()
    {
        _window = new NativeWindow();
        _window.AssignHandle(new CreateParams().CreateHandle()); // Create the window handle
        _window.WndProc += WndProc; // Assign the window procedure
    }

    // Registers a hotkey
    public void Register(ModifierKeys modifiers, Keys key)
    {
        _hotKeyId++; // Generate a unique ID
        if (!RegisterHotKey(_window.Handle, _hotKeyId, (uint)modifiers, (uint)key))
        {
            throw new Exception("Failed to register hotkey.");
        }
    }

    // Unregisters all hotkeys
    public void Unregister()
    {
        for (int i = 1; i <= _hotKeyId; i++)
        {
            UnregisterHotKey(_window.Handle, i);
        }
        _window.ReleaseHandle(); // Release the window handle
    }

    // Window procedure to handle hotkey messages
    private void WndProc(ref Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            // Extract key and modifiers from message parameters
            Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
            ModifierKeys modifiers = (ModifierKeys)((int)m.LParam & 0xFFFF);

            // Raise the HotkeyPressed event
            HotkeyPressed?.Invoke(this, new HotkeyPressedEventArgs(modifiers, key));
        }
    }

    // Event fired when a registered hotkey is pressed
    public event EventHandler<HotkeyPressedEventArgs> HotkeyPressed;

    // IDisposable implementation
    public void Dispose()
    {
        Unregister();
        _window.Dispose();
    }
}

// Event arguments for HotkeyPressed event
public class HotkeyPressedEventArgs : EventArgs
{
    public ModifierKeys Modifiers { get; }
    public Keys Key { get; }

    public HotkeyPressedEventArgs(ModifierKeys modifiers, Keys key)
    {
        Modifiers = modifiers;
        Key = key;
    }
}

// Enum for hotkey modifiers
[Flags]
public enum ModifierKeys : uint
{
    None = 0,
    Alt = 1,
    Control = 2,
    Shift = 4,
    Win = 8
}</code>
로그인 후 복사

사용 예(WinForms):

<code class="language-csharp">public partial class Form1 : Form
{
    private GlobalHotkey _globalHotkey;

    public Form1()
    {
        InitializeComponent();
        _globalHotkey = new GlobalHotkey();
        _globalHotkey.HotkeyPressed += GlobalHotkey_HotkeyPressed;
        _globalHotkey.Register(ModifierKeys.Control | ModifierKeys.Alt, Keys.J);
    }

    private void GlobalHotkey_HotkeyPressed(object sender, HotkeyPressedEventArgs e)
    {
        // Handle the hotkey press here
        MessageBox.Show($"Hotkey pressed: Ctrl+Alt+J");
    }

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        _globalHotkey.Dispose(); // Important: Dispose of the hotkey when the form closes
        base.OnFormClosing(e);
    }
}</code>
로그인 후 복사

리소스 누출을 방지하려면 GlobalHotkey에 표시된 대로 오류 처리를 추가하고 OnFormClosing 인스턴스를 적절하게 폐기해야 합니다. 이 수정된 코드는 C# WinForms 애플리케이션에서 전역 단축키를 관리하기 위한 더욱 강력하고 이해하기 쉬운 솔루션을 제공합니다.

위 내용은 응용 프로그램에 초점이 없는 경우에도 응용 프로그램 이벤트를 트리거하도록 C#에서 전역 단축키를 설정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿