1
unit UnitRawInput;
2
3
interface
4
5
uses
6
SysUtils, Classes,Windows,uRawInput,Forms,messages;
7
8
9
type
10
TRawKeyPressEvent = procedure(sender:TObject;key:word;KeyboardHandle:THANDLE) of object;
11
12
TRawKeyDownEvent = TRawKeyPressEvent;
13
TRawKeyUpEvent = TRawKeyPressEvent;
14
type
15
TRawInputKeyboard = class(TComponent)
16
private
17
FOldOnMessage:TMessageEvent;
18
FOnRawKeyDown:TRawKeyPressEvent;
19
FOnRawKeyUp:TRawKeyPressEvent;
20
procedure ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
21
procedure RegisterRaw;
22
protected
23
procedure ProcessKeyPressMessage(var Msg: tagMSG; Keyboard:RAWKEYBOARD;KeyboardHandle:THANDLE);
24
procedure DoRawKeyDown(Key: Word;KeyboardHandle:THANDLE);
25
procedure DoRawKeyUp(Key: Word;KeyboardHandle:THANDLE);
26
public
27
constructor Create(AOwner: TComponent); override;
28
destructor Destroy; override;
29
published
30
property OnRawKeyDown:TRawKeyDownEvent read FOnRawKeyDown write FOnRawKeyDown;
31
property OnRawKeyUp:TRawKeyUpEvent read FOnRawKeyUp write FOnRawKeyUp;
32
end;
33
34
procedure Register;
35
36
implementation
37
38
procedure Register;
39
begin
40
RegisterComponents('lance', [TRawInputKeyboard]);
41
end;
42
43
{ TRawInput }
44
45
procedure TRawInputKeyboard.ApplicationEventsMessage(var Msg: tagMSG;
46
var Handled: Boolean);
47
var
48
Size: cardinal;
49
ttagRAWINPUT: tagRAWINPUT;
50
51
ttagRAWKEYBOARD:tagRAWKEYBOARD;
52
KeyboardHandle:THANDLE;
53
54
55
begin
56
if (msg.message=WM_INPUT) then
57
begin
58
Size:= sizeOf(RAWINPUTHEADER);
59
ttagRAWINPUT.header.dwSize := sizeOf(RAWINPUTHEADER);
60
61
if GetRawInputData(HRAWINPUT(Msg.LParam),
62
RID_HEADER, @ttagRAWINPUT, Size, sizeof(RAWINPUTHEADER))>0 then
63
begin
64
if (ttagRAWINPUT.header.dwType = RIM_TYPEKEYBOARD) then
65
begin
66
Size := ttagRAWINPUT.header.dwSize;
67
if GetRawInputData (HRAWINPUT(Msg.LParam),
68
RID_INPUT, @ttagRAWINPUT, Size, sizeOf(RAWINPUTHEADER))>= 0 then
69
begin
70
ttagRAWKEYBOARD.VKey := ttagRAWINPUT.keyboard.VKey;
71
ttagRAWKEYBOARD.Flags := ttagRAWINPUT.keyboard.Flags;
72
ttagRAWKEYBOARD.MakeCode := ttagRAWINPUT.keyboard.MakeCode;
73
ttagRAWKEYBOARD.Message := ttagRAWINPUT.keyboard.Message;
74
KeyboardHandle := ttagRAWINPUT.header.hDevice;
75
ProcessKeyPressMessage(msg,ttagRAWKEYBOARD,KeyboardHandle);
76
end;
77
end;
78
end;
79
80
end; //end if (msg.message=WM_INPUT) then
81
82
if assigned(FOldOnMessage) then FOldOnMessage( Msg,Handled);
83
end;
84
85
86
constructor TRawInputKeyboard.Create(AOwner: TComponent);
87
begin
88
inherited Create(AOwner);;
89
FOldOnMessage:=Application.OnMessage;
90
Application.OnMessage:=ApplicationEventsMessage;
91
RegisterRaw;
92
end;
93
94
destructor TRawInputKeyboard.Destroy;
95
begin
96
inherited;
97
end;
98
procedure TRawInputKeyboard.ProcessKeyPressMessage(var Msg: tagMSG;
99
Keyboard: RAWKEYBOARD; KeyboardHandle: THANDLE);
100
begin
101
case Keyboard.Message of
102
WM_KEYDOWN : DoRawKeyDown(keyboard.VKey,KeyboardHandle);
103
WM_KEYUP : DoRawKeyUp(Keyboard.VKey,KeyboardHandle);
104
end;
105
end;
106
procedure TRawInputKeyboard.DoRawKeyDown(Key: Word;KeyboardHandle: THANDLE);
107
begin
108
if assigned(FOnRawKeyDown) then
109
FOnRawKeyDown(self,key,KeyboardHandle);
110
end;
111
procedure TRawInputKeyboard.DoRawKeyUp(Key: Word;KeyboardHandle: THANDLE);
112
begin
113
if assigned(FOnRawKeyUp) then
114
FOnRawKeyUp(self,key,KeyboardHandle);
115
end;
116
procedure TRawInputKeyboard.RegisterRaw;
117
var
118
Size: Cardinal;
119
RRawIinputDevice: array[0..0] of RAWINPUTDEVICE;
120
begin
121
RRawIinputDevice[0].usUsagePage := 1;
122
RRawIinputDevice[0].usUsage := 6;
123
RRawIinputDevice[0].dwFlags := RIDEV_CAPTUREMOUSE;
124
RRawIinputDevice[0].hwndTarget := Application.Handle;
125
Size:= sizeOf(RAWINPUTDEVICE);
126
if not (RegisterRawInputDevices(@RRawIinputDevice, 1, Size)) then
127
begin
128
raise Exception.Create('RegisterRawInputDevices error!');
129
end
130
end;
131
132
end.

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

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

运行效果: