1

我正在尝试创建一个 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;

LParam我相信它必须根据这个链接做一些事情,但我仍然无法弄清楚。

先感谢您。

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

4

1 回答 1

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;
于 2013-08-12T20:30:20.423 回答