public class NativeWIN32 { public NativeWIN32() { } /* ------- using WIN32 Windows API in a C# application ------- */ [DllImport("user32.dll", CharSet = CharSet.Auto)] static public extern IntPtr GetForegroundWindow(); // [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct STRINGBUFFER { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string szText; } [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_CLOSE = 0xF060; public delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr next, string sClassName, IntPtr sWindowTitle); /* ------- using HOTKEYs in a C# application ------- in form load : bool success = RegisterHotKey(Handle, 100, KeyModifiers.Control | KeyModifiers.Shift, Keys.J); in form closing : UnregisterHotKey(Handle, 100); protected override void WndProc( ref Message m ) { const int WM_HOTKEY = 0x0312; switch(m.Msg) { case WM_HOTKEY: MessageBox.Show("Hotkey pressed"); break; } base.WndProc(ref m ); } ------- using HOTKEYs in a C# application ------- */ [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey(IntPtr hWnd, // handle to window int id, // hot key identifier KeyModifiers fsModifiers, // key-modifier options Keys vk // virtual-key code ); [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey(IntPtr hWnd, // handle to window int id // hot key identifier ); [Flags()] public enum KeyModifiers { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8 } }
在Form中Load事件中首先注册热键
/// <summary> /// 注册热键 /// </summary> /// <param name="c">按键</param> /// <param name="bCtrl">是否需要ctrl</param> /// <param name="bShift">是否需要shift</param> /// <param name="bAlt">是否需要alt</param> /// <param name="bWindows">是否需要win</param> public void SetHotKey(Keys c, bool bCtrl, bool bShift, bool bAlt, bool bWindows) { //先赋到变量 Keys m_key = c; bool m_ctrlhotkey = bCtrl; bool m_shifthotkey = bShift; bool m_althotkey = bAlt; bool m_winhotkey = bWindows; //注册系统热键 NativeWIN32.KeyModifiers modifiers = NativeWIN32.KeyModifiers.None; if (bCtrl) modifiers |= NativeWIN32.KeyModifiers.Control; if (bShift) modifiers |= NativeWIN32.KeyModifiers.Shift; if (bAlt) modifiers |= NativeWIN32.KeyModifiers.Alt; if (bWindows) modifiers |= NativeWIN32.KeyModifiers.Windows; NativeWIN32.RegisterHotKey(Handle, 100, modifiers, c); }
然后监听消息,处理事件
/// <summary> /// 重写windows消息响应 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { const int wmHotkey = 0x0312; switch (m.Msg) { case wmHotkey: WindowMax(); break; } base.WndProc(ref m); }
winform接收全局的快捷键
时间: 2024-10-10 05:03:25