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

  • 相关阅读:
    【20211012】以确定去适应不确定
    【20211011】工作之余
    【20211009】二孩的心思
    【20211010】幸福声响
    【20211007】连岳摘抄
    【读书笔记】《创新与企业家精神》
    【20211006】连岳摘抄
    【20211008】生活规律,事情也好解决
    ASP.NET中DataGrid的简单用法
    无限级分类的实现
  • 原文地址:https://www.cnblogs.com/tuyile006/p/949212.html
Copyright © 2011-2022 走看看