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によると、何かをしなければならないと思いますが、まだ理解できません。

前もって感謝します。

編集:この問題に何時間も費やした後、LinuxキーコードテーブルLParamHiに似たコードを返し、これらの各キーの異なるコードを送信できることがわかりました。たとえば、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 に答える