Delphi Xe2:WH#u键盘赢得';t返回左右虚拟钥匙代码

Delphi Xe2:WH#u键盘赢得';t返回左右虚拟钥匙代码,delphi,hook,virtual-keyboard,Delphi,Hook,Virtual Keyboard,我正在尝试创建一个DLL,以便(全局)钩住按键笔划并将它们发送到我的应用程序。一切正常(挂钩、发短信等)。我唯一的问题是无法返回左右虚拟键的代码(VK_LSHIFT、VK_RSHIFT、VK_LCONTROL等) 我花了几个小时阅读了有关KeyboardProc、VkKeyScan、MapVirtualKey等的msdn。。没有办法解决问题。这是我的密码: function HookCallBack(Code: Integer; wParam: WPARAM; lParam: LPARAM):

我正在尝试创建一个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;
函数HookCallBack(代码:Integer;wParam:wParam;lParam:lParam):LongInt;stdcall;
开始
结果:=0;
如果(代码
我相信它必须与
LParam
有关,但我仍然无法理解

先谢谢你


编辑:在这个问题上花了很多时间之后,我发现
LParamHi
返回的代码与能够发送每个键的不同代码的代码类似。例如,LSHIFT=42,RSHIFT=54,LCTRL=29,RCTRL=29+256(?)等等。我现在正试图弄清楚这些小细节。

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;

我希望我能投你的票,但上面说我需要15个声誉:)不管怎样,我认为他们有自己的代码(从0xA0到0xA5),所以我试图捕捉它们。但无论如何,它们总是返回0x10(shift)、0x11(ctrl)、0x12(alt)。谢谢您的回复:)