C# 针对自己开发的软件设置热键,写一个范例
时间: 2024-10-22 15:17:15 浏览: 25
在 C# 中,你可以使用 `System.Windows.Forms.KeyEventHandler` 和 `ShortcutKeys` 构造函数来为应用程序添加自定义热键。下面是一个简单的范例,展示如何为一个按钮添加一个快捷键:
```csharp
using System;
using System.Windows.Forms;
public partial class Form1 : Form
{
private bool _hotKeyPressed = false; // 热键是否按下
public Form1()
{
InitializeComponent();
// 添加热键事件处理程序
AddHotkey(Keys.Control + Keys+A); // Ctrl + A 作为热键
button1.Click += Button_Click;
}
private void AddHotkey(Keys keys)
{
// 创建 HotKey 类型的事件处理器
EventHandler<KeyEventArgs> hotKeyHandler = (sender, e) =>
{
if (e.KeyCode == keys && !e.Handled)
{
// 检查热键是否正在按住
if (!_hotKeyPressed)
{
Console.WriteLine("热键按下: " + keys);
_hotKeyPressed = true;
}
else
{
Console.WriteLine("热键释放");
_hotKeyPressed = false;
}
e.Handled = true; // 阻止 Windows 自动处理此热键
}
};
// 将热键事件附加到窗体上
Application.AddMessageFilter(new MyMessageFilter(hotKeyHandler, keys));
}
// 按钮点击事件的处理
private void Button_Click(object sender, EventArgs e)
{
Console.WriteLine("按钮被点击");
}
// 自定义消息过滤器,用于接收和处理 Windows 的热键消息
private class MyMessageFilter : IMessageFilter
{
private readonly EventHandler<KeyEventArgs> _handler;
private readonly Keys _keys;
public MyMessageFilter(EventHandler<KeyEventArgs> handler, Keys keys)
{
_handler = handler;
_keys = keys;
}
// 处理消息的必要条件
public int PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN && (m.WParam.ToInt32() & 0x0000FFFF) == _keys)
{
_handler.Invoke(this, new KeyEventArgs((Keys)m.WParam));
return HwndUtils.MessageWasHandled;
}
return 0;
}
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
// Windows 消息常量
const uint WM_KEYDOWN = 0x0100;
const uint WM_QUIT = 0x0012;
const int HwndUtils_MessageWasHandled = -1;
}
}
// 运行应用程序时,Ctrl + A 快捷键将触发相应的事件
```
这个例子中,当用户按下 `Ctrl + A` 键时,会打印出一条消息并表示热键已被按下。当松开这个组合键时,还会收到释放的消息。
阅读全文