我正在尝试创建一个DLL,以便(全局)挂钩键击并将它们发送到我的应用程序。一切都很好(钩子,消息等)。我唯一的问题是我无法设法返回左右虚拟键的代码(VK_LSHIFT,VK_RSHIFT,VK_LCONTROL等)。
我花了几个小时阅读有关KeyboardProc,VkKeyScan,MapVirtualKey等的msdn,但没有能够解决问题。这是我的代码:
function HookCallBack(Code: Integer; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
begin
Result := 0;
if (Code < HC_ACTION) then Exit;
if (Code = HC_NOREMOVE) then Result := CallNextHookEx(Keyboard, Code, wParam, lParam);
if (Code = HC_ACTION) then begin
PostMessage(Reciever, WM_USER + 1, wParam, lParam);
Result := CallNextHookEx(Keyboard, Code, wParam, lParam);
end;
end;
我认为必须根据this link对LParam
做些什么,但我仍然无法弄明白。
提前谢谢。
编辑:花了很多时间解决此问题后,我发现LParamHi
返回的代码类似于linux keycode table,可以发送每个密钥的不同代码。例如,LSHIFT = 42,RSHIFT = 54,LCTRL = 29,RCTRL = 29 + 256(?)等。我现在正试图找出这些小细节。
答案 0 :(得分:2)
Shift,Alt,Ctrl - 不是键。它是一个关键修饰符,这些键没有自己的真实键码。只有按下其他非修改键才能真正检测到它们。
请参阅TWinControl实现以了解如何检测这些键:
function TWinControl.DoKeyDown(var Message: TWMKey): Boolean;
var
ShiftState: TShiftState;
Form, FormParent: TCustomForm;
LCharCode: Word;
begin
...
with Message do
begin
ShiftState := KeyDataToShiftState(KeyData); //see this method.
if not (csNoStdEvents in ControlStyle) then
begin
LCharCode := CharCode;
KeyDown(LCharCode, ShiftState);
CharCode := LCharCode;
if LCharCode = 0 then Exit;
end;
end;
Result := False;
end;