基于C#實(shí)現(xiàn)熱鍵注冊(cè)工具類
寫在前面
介紹一個(gè)驗(yàn)證過(guò)的熱鍵注冊(cè)工具類,使用系統(tǒng)類庫(kù)user32.dll
中的RegisterHotkey
函數(shù)來(lái)實(shí)現(xiàn)全局熱鍵的注冊(cè)。
代碼實(shí)現(xiàn)
[Flags] public enum KeyModifiers { Alt = 1, Control = 2, Shift = 4, Windows = 8, NoRepeat = 0x4000 } public static class HotKeyHelper { [DllImport("user32", SetLastError = true)] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("user32", SetLastError = true)] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); private static int _id = 0; private static volatile MessageWindow _wnd; private static volatile IntPtr _hwnd; private static ManualResetEvent _windowReadyEvent = new ManualResetEvent(false); static HotKeyHelper() { Thread messageLoop = new Thread(delegate () { Application.Run(new MessageWindow()); }); messageLoop.Name = "MessageLoopThread"; messageLoop.IsBackground = true; messageLoop.Start(); } public static event EventHandler<HotKeyEventArgs> HotKeyPressed; public static int RegisterHotKey(Keys key, KeyModifiers modifiers) { _windowReadyEvent.WaitOne(); int id = System.Threading.Interlocked.Increment(ref _id); _wnd.Invoke(new RegisterHotKeyDelegate(RegisterHotKeyInternal), _hwnd, id, (uint)modifiers, (uint)key); return id; } public static void UnregisterHotKey(int id) { _wnd.Invoke(new UnRegisterHotKeyDelegate(UnRegisterHotKeyInternal), _hwnd, id); } delegate void RegisterHotKeyDelegate(IntPtr hwnd, int id, uint modifiers, uint key); delegate void UnRegisterHotKeyDelegate(IntPtr hwnd, int id); private static void RegisterHotKeyInternal(IntPtr hwnd, int id, uint modifiers, uint key) { RegisterHotKey(hwnd, id, modifiers, key); } private static void UnRegisterHotKeyInternal(IntPtr hwnd, int id) { UnregisterHotKey(_hwnd, id); } private static void OnHotKeyPressed(HotKeyEventArgs e) { if (HotKeyHelper.HotKeyPressed != null) { HotKeyHelper.HotKeyPressed(null, e); } } private class MessageWindow : Form { public MessageWindow() { _wnd = this; _hwnd = this.Handle; _windowReadyEvent.Set(); } protected override void WndProc(ref Message m) { if (m.Msg == WM_HOTKEY) { HotKeyEventArgs e = new HotKeyEventArgs(m.LParam); HotKeyHelper.OnHotKeyPressed(e); } base.WndProc(ref m); } protected override void SetVisibleCore(bool value) { // Ensure the window never becomes visible base.SetVisibleCore(false); } private const int WM_HOTKEY = 0x312; } } public class HotKeyEventArgs : EventArgs { public readonly Keys Key; public readonly KeyModifiers Modifiers; public HotKeyEventArgs(Keys key, KeyModifiers modifiers) { this.Key = key; this.Modifiers = modifiers; } public HotKeyEventArgs(IntPtr hotKeyParam) { uint param = (uint)hotKeyParam.ToInt64(); Key = (Keys)((param & 0xffff0000) >> 16); Modifiers = (KeyModifiers)(param & 0x0000ffff); } }
調(diào)用示例
void RegisterHotKeyTest() { HotKeyHelper.RegisterHotKey(Keys.B, KeyModifiers.Alt); HotKeyHelper.HotKeyPressed += new EventHandler<HotKeyEventArgs>(OnHotKeyPressed); } void OnHotKeyPressed(object sender, HotKeyEventArgs e) { MessageBox.Show("Alt + B"); }
執(zhí)行結(jié)果
如果需要注冊(cè)成Windows服務(wù)在后臺(tái)運(yùn)行,需要開啟Service的允許與桌面交互選項(xiàng)。
到此這篇關(guān)于基于C#實(shí)現(xiàn)熱鍵注冊(cè)工具類的文章就介紹到這了,更多相關(guān)C#熱鍵注冊(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)...2007-08-08C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解
這篇文章主要為大家介紹了C#中一維數(shù)組如何快速實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法,可實(shí)現(xiàn)系統(tǒng)服務(wù)的啟動(dòng)和停止功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04