在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


2

3

4

5

6

7

8

9

10

11

12

13

14

15



16

17

18



19

20

21

22

23

24

25

26

27

28



29

30

31

32

33

34

35

36

37

38



39

40

41

42

43

44

45

46

47

48

49

50


51

52

53

54

55

56

57

58

59

60

61

62

63

64



65

66

67



68

69

70

71

72

73

74

75


76

77

78

以上代码在Windows2008下测试通过。