zoukankan      html  css  js  c++  java
  • C# 注册热键

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Runtime.InteropServices;
    
    namespace ConsoleTest
    {
        public static class HotKeyManager
        {
            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 (HotKeyManager.HotKeyPressed != null)
                {
                    HotKeyManager.HotKeyPressed(null, e);
                }
            }
    
            private static volatile MessageWindow _wnd;
            private static volatile IntPtr _hwnd;
            private static ManualResetEvent _windowReadyEvent = new ManualResetEvent(false);
            static HotKeyManager()
            {
                Thread messageLoop = new Thread(delegate()
                {
                    Application.Run(new MessageWindow());
                });
                messageLoop.Name = "MessageLoopThread";
                messageLoop.IsBackground = true;
                messageLoop.Start();
            }
    
            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);
                        HotKeyManager.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;
            }
    
            [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;
        }
    
    
        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);
            }
        }
    
        [Flags]
        public enum KeyModifiers
        {
            Alt = 1,
            Control = 2,
            Shift = 4,
            Windows = 8,
            NoRepeat = 0x4000
        }
    }
    static void Main(string[] args)
            {
                
    
                HotKeyManager.RegisterHotKey(Keys.A, KeyModifiers.Alt);
                HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);
    
                Console.ReadLine();
            }
    
            static void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
            {
                Console.WriteLine("Hit me!");
            }

     需要开启Service的允许与桌面交互选项,否则不行。

  • 相关阅读:
    一、Redis源码结构
    StringUtils工具类用法
    什么是多态
    Spring事务配置的五种方式
    不错的spring学习博客
    hibernate.current_session_context_class 比较权威的解释
    搞搞hibernate.current_session_context_class
    Spring MVC @Transactional注解方式事务失效的解决办法
    spring 中 hibernate 的 2种 配置方式(新旧 2种方式)
    Spring+Hibernate整合配置 --- 比较完整的spring、hibernate 配置
  • 原文地址:https://www.cnblogs.com/nanfei/p/2770096.html
Copyright © 2011-2022 走看看