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          }  

 

 

 

你可能感兴趣的:(win7)