2013-08-12 4 views
1

Я пытаюсь создать DLL для того, чтобы (глобально) нажимать клавиши и отправлять их в мое приложение. Все работает нормально (перехват, обмен сообщениями и т. Д.). Единственная проблема, с которой я сталкиваюсь, это то, что я не могу вернуть коды виртуальных ключей слева-справа (VK_LSHIFT, VK_RSHIFT, VK_LCONTROL и т. Д.).Delphi Xe2: WH_KEYBOARD не возвращает коды виртуального ключа влево-вправо

Я потратил несколько часов на чтение msdn о KeyboardProc, VkKeyScan, MapVirtualKey и т. Д., Не имея возможности сделать решение. Вот мой код:

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 согласно this link, но я до сих пор не в состоянии понять это.

Заранее спасибо.

Редактировать: Проведя много часов на этой проблеме, я узнал, что LParamHi возвращает коды, похожие на linux keycode table, которые могут отправлять разные коды каждого из этих ключей. Например, LSHIFT = 42, RSHIFT = 54, LCTRL = 29, RCTRL = 29 + 256 (?) И т. Д. Теперь я пытаюсь выяснить эти мелкие детали.

ответ

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; 
+0

Я хотел бы голосовать за вас, но он говорит, что мне нужно 15 репутации :) Во всяком случае, я думал, что у них есть свой собственный код (от 0xA0 до 0xA5), поэтому я пытался их захватить. Но да, несмотря ни на что, они всегда возвращают 0x10 (сдвиг), 0x11 (ctrl), 0x12 (alt). Спасибо за ваш ответ :) –