弹出窗口杀手(下)

弹出窗口杀手(下)


作者: TheAres  &;nbsp来自:网络


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

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [C#] 的这些文章也感兴趣:

在VisualC#中访问不同数据库(1)
使应用程序只能运行单个实例
Microsoft.NET完全介绍(下)
.NET语言的选择
将sqlserver中的数据倒入Excel(c#)
Windows窗体控件开发示例:扩展TreeView
C# 按字节截取字符串
用VisualC#做DLL文件(2)
VisualC#中使用线程
六种快速修理C# Bug的方法