弹出窗口杀手(下)

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

posted @ 2007-11-04 22:47  小y  阅读(652)  评论(0编辑  收藏  举报