Delphi Xe2:WH_KEYBOARD不会返回左右虚拟键代码

时间:2013-08-12 14:01:20

标签: delphi hook virtual-keyboard

我正在尝试创建一个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 linkLParam做些什么,但我仍然无法弄明白。

提前谢谢。

编辑:花了很多时间解决此问题后,我发现LParamHi返回的代码类似于linux keycode table,可以发送每个密钥的不同代码。例如,LSHIFT = 42,RSHIFT = 54,LCTRL = 29,RCTRL = 29 + 256(?)等。我现在正试图找出这些小细节。

1 个答案:

答案 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;