弹出窗口杀手(下)

上接 弹出窗口杀手(上)

注册系统热键

系统热键用在像弹出窗口杀手这种应用程序非常有用 , 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

(全文完)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus