zoukankan      html  css  js  c++  java
  • win7自动壁纸切换小工具AutoDesk三:全局热键

    全局热键,博客园有很多现成的文章,下面的实现感觉封装的比较好,用起来也比较方便(感谢博客园的网友)

     1 using System;  
     2 using System.Runtime.InteropServices;  
     3   
     4 namespace SystemHotKey  
     5 {  
     6     public delegate void HotkeyEventHandler(int HotKeyID);  
     7   
     8     public class Hotkey : System.Windows.Forms.IMessageFilter  
     9     {  
    10         System.Collections.Hashtable keyIDs = new System.Collections.Hashtable();  
    11         IntPtr hWnd;  
    12   
    13         public event HotkeyEventHandler OnHotkey;  
    14   
    15         public enum KeyFlags  
    16         {  
    17             MOD_ALT = 0x1,  
    18             MOD_CONTROL = 0x2,  
    19             MOD_SHIFT = 0x4,  
    20             MOD_WIN = 0x8  
    21         }  
    22         [DllImport("user32.dll")]  
    23         public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);  
    24   
    25         [DllImport("user32.dll")]  
    26         public static extern UInt32 UnregisterHotKey(IntPtr hWnd, UInt32 id);  
    27   
    28         [DllImport("kernel32.dll")]  
    29         public static extern UInt32 GlobalAddAtom(String lpString);  
    30   
    31         [DllImport("kernel32.dll")]  
    32         public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);  
    33   
    34         public Hotkey(IntPtr hWnd)  
    35         {  
    36             this.hWnd = hWnd;  
    37             System.Windows.Forms.Application.AddMessageFilter(this);  
    38         }  
    39   
    40         public int RegisterHotkey(System.Windows.Forms.Keys Key, KeyFlags keyflags)  
    41         {  
    42             UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());  
    43             RegisterHotKey((IntPtr) hWnd, hotkeyid, (UInt32) keyflags, (UInt32) Key);  
    44             keyIDs.Add(hotkeyid, hotkeyid);  
    45             return (int) hotkeyid;  
    46         }  
    47   
    48         public void UnregisterHotkeys()  
    49         {  
    50             System.Windows.Forms.Application.RemoveMessageFilter(this);  
    51             foreach (UInt32 key in keyIDs.Values)  
    52             {  
    53                 UnregisterHotKey(hWnd, key);  
    54                 GlobalDeleteAtom(key);  
    55             }  
    56         }  
    57   
    58         public bool PreFilterMessage(ref System.Windows.Forms.Message m)  
    59         {  
    60             if (m.Msg == 0x312)  
    61             {  
    62                 if (OnHotkey != null)  
    63                 {  
    64                     foreach (UInt32 key in keyIDs.Values)  
    65                     {  
    66                         if ((UInt32) m.WParam == key)  
    67                         {  
    68                             OnHotkey((int) m.WParam);  
    69                             return true;  
    70                         }  
    71                     }  
    72                 }  
    73             }  
    74             return false;  
    75         }  
    76     }  
    77 }  

    该类的使用方法:

    在窗体的类中声明一个变量 
    private int Hotkey1
    在窗体的Load事件中加入如下代码 

     1 /// <summary>
     2 /// 窗体启动时挂载全局快捷键Ctrl+F1.
     3 /// </summary>
     4 /// <param name="sender"></param>
     5 /// <param name="e"></param>
     6 private void AutoDesk_Load(object sender, EventArgs e)
     7 {
     8 try
     9 {
    10 
    11 SystemHotKey.Hotkey hotkey;
    12 hotkey = new SystemHotKey.Hotkey(this.Handle); 
    13 
    14 //定义快键(Ctrl + F1) 
    15 Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.F1, SystemHotKey.Hotkey.KeyFlags.MOD_CONTROL);
    16 hotkey.OnHotkey += new SystemHotKey.HotkeyEventHandler(OnHotkey);
    17 
    18 }
    19 catch (Exception ex)
    20 {
    21 MessageBox.Show(ex.Message);
    22 }
    23 }

    热键的响应函数如下:

     1 /// <summary>
     2         /// 快捷键按下后切换到下一个随即壁纸。
     3         /// </summary>
     4         /// <param name="HotkeyID"></param>
     5          public void OnHotkey(int HotkeyID)  
     6          {
     7              try
     8              {
     9                  if (HotkeyID == Hotkey1)
    10                  {
    11                      switch_to_next_waller();
    12                  }
    13                  else
    14                  {
    15                      //this.Visible = false;  
    16                  }
    17              }
    18              catch (Exception ex)
    19              {
    20                  MessageBox.Show(ex.Message);
    21              }
    22          }  

     

  • 相关阅读:
    数据挖掘实践(45):实战--啤酒产量时序分析(三)
    数据挖掘实践(44):实战--啤酒产量时序分析(二)
    数据挖掘实践(43):实战--啤酒产量时序分析(一)
    数据挖掘实践(42):算法基础(十四)时间序列分析(五)
    Java 之 数组 案例(不重复的数组&回形数)
    Java 之 数组中常见的异常
    Java 之 数组 Arrays 工具类
    Java 之 数组常用算法
    Java 之 多维数组(二维数组)
    Java 之 一维数组
  • 原文地址:https://www.cnblogs.com/linbirg/p/2578563.html
Copyright © 2011-2022 走看看