- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
WM_KEYDOWN: begin
if GetAsyncKeyState(VK_CONTROL) <> 0 then case W of
integer('X') : SendMessage(H, WM_CUT, 0, 0);
integer('C') : SendMessage(H, WM_COPY, 0, 0);
integer('V') : SendMessage(H, WM_PASTE, 0, 0);
integer('Z') : SendMessage(H, WM_UNDO , 0, 0);
integer('Y') : ReDo(H);
integer('A') : SelectAll(H);
VK_INSERT : SendMessage(H, WM_COPY, 0, 0);
VK_PRIOR : MoveCaretLine (H, -1000000);
VK_NEXT : MoveCaretLine (H, 1000000);
VK_DELETE : SendMessage(H, WM_CLEAR, 0, 0);
// end else if GetAsyncKeyState(VK_ALT) then case W of
// VK_BACK : SendMessage(H, WM_UNDO , 0, 0);
end else if GetAsyncKeyState(VK_SHIFT) <> 0 then case W of
VK_DELETE : SendMessage(H, WM_CUT , 0, 0);
VK_INSERT : SendMessage(H, WM_PASTE, 0, 0);
end else case W of
VK_SHIFT : SDown(H);
VK_LEFT : MoveCaretSymbol (H, -1);
VK_RIGHT : MoveCaretSymbol (H, 1);
VK_UP : MoveCaretLine (H, -1);
VK_DOWN : MoveCaretLine (H, 1);
VK_PRIOR : MoveCaretLine (H, -MaxLinesInScreenByH(H));
VK_NEXT : MoveCaretLine (H, MaxLinesInScreenByH(H));
VK_DELETE : DeleteSymbol(H, False);
end;
DrawText(H);
Exit;
end;
Пишу свой винапи-класс типа Edit.
Так сделаны горячие клавиши.
А вообще я хотел подсветку синтаксиса.
Что, простите?
Как это по-нормальному делается? Я про горячие клавиши в своих компонентах.
Разве что мы говорим про разные хуки.
P.S. Всё равно делать это хуком - грязный хак.
function DoKeyDown(Key: Word; Shift: TShiftState): integer;
// тут вся обработка
procedure RExcelGridViewer.WMKeyDown2(var Message: TWMKeyDown); message CM_CHILDKEY;
var ss: TShiftState;
ks: TKeyboardState;
begin
if (not Focused) then exit;
GetKeyboardState(ks);
ss := KeyboardStateToShiftState(ks);
Message.Result := DoKeyDown(Message.CharCode, ss);
end;
FOnKeyDown: TKeyEvent;
property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
в конструкторе
inherited OnKeyDown := MyOnKeyDown;
FOnKeyDown := NIL;
и обработчик
procedure MyKeyDown(...);
begin
// тут обработка
if (Assigned(FOnKeyDown)) then FOnKeyDown(...);
end;