在WPF中如何注冊熱鍵
不說廢話,直接看代碼吧
,其關鍵就是 System.Windows.Interop.HwndSource類。
第一步:注冊熱鍵,需要使用API函數,具體的參照網上的其它文章。唯一需要注意的是需要使用KeyInterop.VirtualKeyFromKey函數將
WPF的Key枚舉轉化為API函數可以使用的VirtualKeyCode :
/// <summary>
/// 注冊熱鍵處理函數
/// </summary>
/// <param name="hWnd">用于處理熱鍵消息的窗體句柄</param>
/// <param name="id">熱鍵的編號</param>
/// <param name="controlKey">控制鍵</param>
/// <param name="virtualKey">熱鍵的虛鍵編碼</param>
/// <returns>
/// <c>true</c>:注冊成功<br/>
/// <c>false</c>:注冊失敗
/// </returns>
/// <remarks></remarks>
/// <history>
/// [ZengE] 2009-7-8 22:28 創建
/// </history>
[System.Runtime.InteropServices.DllImport("user32")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint controlKey, uint virtualKey);
/// <summary>
/// 注銷指定的熱鍵
/// </summary>
/// <param name="hWnd">用于處理熱鍵消息的窗體句柄</param>
/// <param name="id">要注銷的熱鍵編號</param>
/// <returns>
/// <c>true</c>:注銷成功<br/>
/// <c>false</c>:注銷失敗
/// </returns>
/// <remarks></remarks>
/// <history>
/// [ZengE] 2009-7-8 22:30 創建
/// </history>
[System.Runtime.InteropServices.DllImport("user32")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
第二步:注冊熱鍵處理函數,主要的難點就在這里,在.NET的WinForm程序中一般使用重寫Form的WinProc方法或者注冊IMessageFilter來實現的,
但是在WPF中以上兩種方式都無法獲得熱鍵消息的處理機會,除非是在WPF程序中隱藏一個常規的Form
(最開始就是這么弄得,后來覺得實在是太丑陋了)
1

/**//// <summary>2
/// 安裝熱鍵處理掛鉤3
/// </summary>4
/// <param name="window">The window.</param>5
/// <returns>6
/// <c>true</c>:安裝成功<br/>7
/// <c>false</c>:安裝失敗8
/// </returns>9
/// <value>消息源</value>10
/// <remarks></remarks>11
/// <history>12
/// [ZengE] 2009-7-8 23:57 創建13
/// </history>14
public static bool InstallHotKeyHook( Window window )15

{16
//判斷組件是否有效17
if ( null == window )18

{19
//如果無效,則直接返回20
return false;21
}22

23
//獲得窗體的句柄24
System.Windows.Interop.WindowInteropHelper helper = new System.Windows.Interop.WindowInteropHelper( window );25

26
//判斷窗體句柄是否有效27
if ( IntPtr.Zero == helper.Handle )28

{29
//如果句柄無效,則直接返回30
return false;31
}32

33
//獲得消息源34
System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd( helper.Handle );35

36
//判斷消息源是否有效37
if ( null == source )38

{39
//如果消息源無效,則直接返回40
return false;41
}42

43
//掛接事件44
source.AddHook( HotKeyHook );45

46
//返回安裝成功47
return true;48
}49

50

/**//// <summary>51
/// 熱鍵處理過程52
/// </summary>53
/// <param name="hwnd">觸發消息的窗口句柄</param>54
/// <param name="msg">要被處理的消息編號</param>55
/// <param name="wParam">消息參數</param>56
/// <param name="lParam">消息參數</param>57
/// <param name="handled">消息是否被處理</param>58
/// <returns></returns>59
/// <remarks></remarks>60
/// <history>61
/// [ZengE] 2009-7-8 23:54 創建62
/// </history>63
private static IntPtr HotKeyHook( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )64

{65
//判斷是否為熱鍵消息66
if ( msg == WM_HOTKEY )67

{68

69
}70

71
//返回72
return IntPtr.Zero;73
}74

75

/**//// <summary>76
/// 熱鍵消息編號77
/// </summary>78
private const int WM_HOTKEY = 0x0312;
以上代碼在Windows2008下測試通過。
浙公網安備 33010602011771號