一个处理多键盘输入的组件
最近的项目中需要同时处理来自多个键盘的输入信息,使用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.
unit UnitRawInput;2

3
interface4

5
uses6
SysUtils, Classes,Windows,uRawInput,Forms,messages;7

8

9
type10
TRawKeyPressEvent = procedure(sender:TObject;key:word;KeyboardHandle:THANDLE) of object;11

12
TRawKeyDownEvent = TRawKeyPressEvent;13
TRawKeyUpEvent = TRawKeyPressEvent; 14
type15
TRawInputKeyboard = class(TComponent)16
private17
FOldOnMessage:TMessageEvent;18
FOnRawKeyDown:TRawKeyPressEvent;19
FOnRawKeyUp:TRawKeyPressEvent;20
procedure ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);21
procedure RegisterRaw;22
protected23
procedure ProcessKeyPressMessage(var Msg: tagMSG; Keyboard:RAWKEYBOARD;KeyboardHandle:THANDLE);24
procedure DoRawKeyDown(Key: Word;KeyboardHandle:THANDLE);25
procedure DoRawKeyUp(Key: Word;KeyboardHandle:THANDLE);26
public27
constructor Create(AOwner: TComponent); override;28
destructor Destroy; override;29
published30
property OnRawKeyDown:TRawKeyDownEvent read FOnRawKeyDown write FOnRawKeyDown;31
property OnRawKeyUp:TRawKeyUpEvent read FOnRawKeyUp write FOnRawKeyUp;32
end;33

34
procedure Register;35

36
implementation37

38
procedure Register;39
begin40
RegisterComponents('lance', [TRawInputKeyboard]);41
end;42

43
{ TRawInput }44

45
procedure TRawInputKeyboard.ApplicationEventsMessage(var Msg: tagMSG;46
var Handled: Boolean);47
var48
Size: cardinal;49
ttagRAWINPUT: tagRAWINPUT;50

51
ttagRAWKEYBOARD:tagRAWKEYBOARD;52
KeyboardHandle:THANDLE;53

54

55
begin56
if (msg.message=WM_INPUT) then57
begin58
Size:= sizeOf(RAWINPUTHEADER);59
ttagRAWINPUT.header.dwSize := sizeOf(RAWINPUTHEADER);60

61
if GetRawInputData(HRAWINPUT(Msg.LParam),62
RID_HEADER, @ttagRAWINPUT, Size, sizeof(RAWINPUTHEADER))>0 then63
begin64
if (ttagRAWINPUT.header.dwType = RIM_TYPEKEYBOARD) then65
begin66
Size := ttagRAWINPUT.header.dwSize;67
if GetRawInputData (HRAWINPUT(Msg.LParam),68
RID_INPUT, @ttagRAWINPUT, Size, sizeOf(RAWINPUTHEADER))>= 0 then69
begin70
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) then81

82
if assigned(FOldOnMessage) then FOldOnMessage( Msg,Handled);83
end;84

85

86
constructor TRawInputKeyboard.Create(AOwner: TComponent);87
begin88
inherited Create(AOwner);;89
FOldOnMessage:=Application.OnMessage;90
Application.OnMessage:=ApplicationEventsMessage;91
RegisterRaw;92
end;93

94
destructor TRawInputKeyboard.Destroy;95
begin96
inherited;97
end;98
procedure TRawInputKeyboard.ProcessKeyPressMessage(var Msg: tagMSG;99
Keyboard: RAWKEYBOARD; KeyboardHandle: THANDLE);100
begin101
case Keyboard.Message of102
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
begin108
if assigned(FOnRawKeyDown) then109
FOnRawKeyDown(self,key,KeyboardHandle);110
end;111
procedure TRawInputKeyboard.DoRawKeyUp(Key: Word;KeyboardHandle: THANDLE);112
begin113
if assigned(FOnRawKeyUp) then114
FOnRawKeyUp(self,key,KeyboardHandle);115
end;116
procedure TRawInputKeyboard.RegisterRaw;117
var118
Size: Cardinal;119
RRawIinputDevice: array[0..0] of RAWINPUTDEVICE;120
begin121
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)) then127
begin128
raise Exception.Create('RegisterRawInputDevices error!');129
end130
end;131

132
end.运行效果:

浙公网安备 33010602011771号