注册系统热键 系统热键用在像弹出窗口杀手这种应用程序非常有用, Ctrl+Shift+J是缺省热键. 说道实现,我们继续用RegisterHotkey(HWND hWnd, int id, UINT fsModifiers, UINT vkey). 完成,代码如下:
public void SetHotKey(Keys c, bool bCtrl, bool bShift, bool bAlt, bool bWindows) { m_hotkey = c; m_ctrlhotkey = bCtrl; m_shifthotkey = bShift; m_althotkey = bAlt; m_winhotkey = bWindows; // update hotkey NativeWIN32.KeyModifiers modifiers = NativeWIN32.KeyModifiers.None; if (m_ctrlhotkey) modifiers |= NativeWIN32.KeyModifiers.Control; if (m_shifthotkey) modifiers |= NativeWIN32.KeyModifiers.Shift; if (m_althotkey) modifiers |= NativeWIN32.KeyModifiers.Alt; if (m_winhotkey) modifiers |= NativeWIN32.KeyModifiers.Windows; NativeWIN32.RegisterHotKey(Handle, 100, modifiers, m_hotkey); //Keys.J); } 一般的,注册热键要一下几步
/* ------- using HOTKEYs in a C# application ------- -- code snippet by James J Thompson -- 在Form的load 中 : Ctrl+Shift+J bool success = RegisterHotKey(Handle, 100, KeyModifiers.Control | KeyModifiers.Shift, Keys.J); 在 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"); ProcessHotkey(); break; } base.WndProc(ref m ); } public class NativeWIN32 { [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 } } ------- using HOTKEYs in a C# application ------- */ 当我们按下热键以后,流程是这样:首先用HWND GetForegroundWindow()来得到窗体,然后要抓出窗体的标题, GetWindowText(HWND hwnd, /*out*/LPTSTR lpString, int nMaxCount). 具体如下:
protected void ProcessHotkey() { IntPtr hwnd = NativeWIN32.GetForegroundWindow(); if (!hwnd.Equals(IntPtr.Zero)) { NativeWIN32.STRINGBUFFER sWindowTitle; NativeWIN32.GetWindowText(hwnd, out sWindowTitle, 256); if (sWindowTitle.szText.Length>0) AddWindowTitle( sWindowTitle.szText ); // add to the ListView (Form) } }
代码下载: http://www.codeproject.com/useritems/popupkiller/popupkiller_src_update.zip
演示程序: http://www.codeproject.com/useritems/popupkiller/popupkiller_demo_update.zip
转载于:https://www.cnblogs.com/tuyile006/archive/2007/11/04/949212.html
