Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.83.57] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Столкнулся с таким: мне нужно назначить горячую клавишу для моего компонента. Использую TShurtCut в проперте. Хоткею думаю обрабатывать через message WM_HOTKEY. Осталось преобразовать TShurtCut в MOD_??? и VK_???. Как бы это сделать покультурнее?
|
Сообщ.
#2
,
|
|
|
Делал я немного для другого, но многое можешь из этого выдернуть
{- HotKey -} type WordRec = packed record case Integer of 0: (Lo, Hi: Byte); 1: (Bytes: array [0..1] of Byte); end; function Shift2Str(Shift:word):string; begin result:=''; if Shift=0 then begin if ((HiWord(GetKeyState(VK_LWIN))<>0) or (HiWord(GetKeyState(VK_RWIN))<>0)) then result:=result+'Win+'; if HiWord(GetKeyState(vk_Shift))<>0 then result:=result+'Shift+'; if HiWord(GetKeyState(VK_CONTROL))<>0 then result:=result+'Ctrl+'; if HiWord(GetKeyState(VK_MENU))<>0 then result:=result+'Alt+'; end else begin case Shift of 1:result:='Alt+'; 2:result:='Ctrl+'; 3:result:='Ctrl+Alt+'; 4:result:='Shift+'; 5:result:='Shift+Alt+'; 6:result:='Shift+Ctrl+'; 8:result:='Win+'; 9:result:='Win+Alt+'; 10:result:='Win+Ctrl+'; 12:result:='Win+Shift'; end; end; end; function Key2Str2(Key:word):string; var bf: array[0..255] of char; ScanCode: Integer; begin result:=''; ScanCode := MapVirtualKey(WordRec(key).Lo, 0) shl 16; if ScanCode <> 0 then begin GetKeyNameText(ScanCode,bf,sizeof(bf)); result:=bf; end; end; {old} procedure Str2Key(sKey:string;var Key,Shift:word); var k:word; begin Shift:=0; if pos('Win+',sKey)<>0 then Shift:=MOD_WIN or Shift; if pos('Shift+',sKey)<>0 then Shift:=MOD_SHIFT or Shift; if pos('Ctrl+',sKey)<>0 then Shift:=MOD_CONTROL or Shift; if pos('Alt+',sKey)<>0 then Shift:=MOD_ALT or Shift; if Shift<>0 then begin if pos('Win+',sKey)<>0 then Delete(sKey,pos('Win+',sKey),length('Win+')); if pos('Shift+',sKey)<>0 then Delete(sKey,pos('Shift+',sKey),6); if pos('Ctrl+',sKey)<>0 then Delete(sKey,pos('Ctrl+',sKey),5); if pos('Alt+',sKey)<>0 then Delete(sKey,pos('Alt+',sKey),4); end; for k:=3 to 226 do if sKey=Key2Str2(k) then begin key:=k; break; end; end; {- HotKey -} |
Сообщ.
#3
,
|
|
|
Мне подсказали сделать таким образом:
uses Menus; procedure GetHotKey(AShortCut: TShortCut; var VirtKey, Modifiers: Word); var Shift: TShiftState; begin ShortCutToKey(AShortCut, VirtKey, Shift); Modifiers := 0; if ssCtrl in Shift then Modifiers := Modifiers or MOD_CONTROL; if ssShift in Shift then Modifiers := Modifiers or MOD_SHIFT; if ssAlt in Shift then Modifiers := Modifiers or MOD_ALT; end; |