|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Переназначение кнопок клавы. как?
сабж. как в своей проге сделать подобное? допустим надо мне действие клавиши "CTRL" переназначить на "Z" или вообще убрать действие при нажатии?
были идеи насчет хуков, но не знаю как реализовать. помогите плиз =) |
#2
|
||||
|
||||
АП!!!! очень нужно!!!((
|
#3
|
||||
|
||||
Хуки... Может и можно. По идеи, сообщение о нажатии клавиши сначала проходит по всем хукам, а потом идет к программам. Так что по идеи можно своим хуком подменить сообщение о нажатии/отпускании на другую кнопку.
Не пробовал переназначить, но вот код хука, который я когда-то писал (блочит всякие кнопки): Код:
library KeyBoardBlock; uses Windows,messages; type KBDLLHOOKSTRUCT = record vkCode: LongWord; scanCode: LongWord; flags: LongWord; time: LongWord; dwExtraInfo:Pointer; end; PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; var KeyHookHandle: hHook = 0; RUN:boolean = false; hMain: hWnd = 0; const LLKHF_ALTDOWN = KF_ALTDOWN shr 8; function KeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall; var p: PKBDLLHOOKSTRUCT; begin if (nCode = HC_ACTION) then begin p := PKBDLLHOOKSTRUCT(lParam); case wparam of WM_KEYDOWN, WM_SYSKEYDOWN: if not run then begin RUN:=((p^.flags and LLKHF_ALTDOWN) <> 0)and // RUN-флаг запуска хука ((GetKeyState(VK_SHIFT)and $8000) <> 0)and // у меня активируется через (p^.scanCode = 33); // Alt+Shift+F end; end; if (run) then // Если запущено (нажали Alt+Shift+F) begin case wParam of WM_KEYDOWN, WM_SYSKEYDOWN, // Нажата какая-то клавиша WM_KEYUP, WM_SYSKEYUP: begin sendmessage(hmain,wparam,p^.vkCode,0); // перенаправляем в мое приложение result := 1; // Если не 0 - то сообщение дальше не пойдет end; end; end else // Если НЕ запущен result := CallNextHookEx(0, nCode, wParam, lParam); // Передаем следующему хуку end; end; // установка, отключение ловушки procedure RunStopHook(lRun:byte; HM:hWnd); export; stdcall; begin if lRun=0 then begin KeyHookHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardProc, HInstance, 0); hMain:=HM; end else if lRun=2 then begin UnhookWindowsHookEx(KeyHookHandle); KeyHookHandle:=0; end; end; // Возврат. Если передали 0 - вырубаем (Run:=false), сбрасываем возможно "залипшие" // кнопки ALT и SHIFT, 1 - проверка, включен ли хук, 2 - ручной запуск function Return(State:byte):boolean; export; stdcall; begin if state=0 then begin Run:=false; keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); end else if state=1 then result:=RUN else run:=true; end; exports RunStopHook name 'RunStopHook'; exports Return name 'Return'; begin end. Если включен - перенаправляет все нажатия кнопок на мою форму, остальные же кнопок не слышат (жаль, что ALT+CTRL+DEL не вырубается. Похоже, он стоит на первом хуке в системе, поэтому его вырубить так нереально). В твоем случае наверно надо поставить при Код:
result := CallNextHookEx(0, nCode, wParam, lParam); // Передаем следующему хуку З.Ы. возможно че-то нужное убрал, но вроде нет. Там просто был еще хук на мышь, который к делу отношения не имеет. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 06.12.2010 в 19:14. |
#4
|
||||
|
||||
сорри, давно не глядел в темку =) за ответ спасибо, попробуем что-ниб придумаем =) например тут же в своей форме обработку клавиш, и соответственно отправку другого результата в активное окно =)
|