zoukankan      html  css  js  c++  java
  • 弹出窗口杀手(下)

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

  • 相关阅读:
    java-初始化和清理
    java-字符串
    java-I/O流
    java-反射和代理
    java-执行流程控制语句
    java-访问控制修饰符
    java-异常
    java-注解
    [ Java学习 ] 一道Java好题的详细题解 001
    [ Java学习 ] 查阅资料整理 002
  • 原文地址:https://www.cnblogs.com/tuyile006/p/949212.html
Copyright © 2011-2022 走看看