最近的项目中需要同时处理来自多个键盘的输入信息,使用raw input可以完美的解决这个问题。封装成一个组件,代码如下:
运行效果:
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
运行效果: