使用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>
注意:
(ModifierKeys)1
、(ModifierKeys)2
等正確轉換修飾鍵。 以上是如何在 C# 中設定全域熱鍵以觸發事件,即使我的應用程式未處於焦點狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!