使用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中文网其他相关文章!