| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Перехват нажатия Alt+Tab |
| Автор: Spawn 15.6.2002, 09:36 |
| Я пробую написать небольшую прогу для блокировки Винды(появляется табличка с просьбой ввода парля), но у меня возникла проблема: так как при нажатии кнопок Alt+Tab происходит переключение на другое окно, то я попроюовал ето обойти при помощи: ... procedure TForm1.Timer1Timer(Sender: TObject); begin if GetForegroundWindow<>Form1.Handle then SetForegroundWindow(Form1.Handle); end; ... но результат етого не радует(есть вероятность, что переключение на другое окно при нажатии Alt+Tab произойдет) и вот тут мне пришел в голову вопрос - а можно ли перехватить нажатие кнопки Alt или Tab?(В событие OnKeyPress получалось перехватить к примеру Shift, но при нажатии Alt ни какой реакции не было ) Подскажите пожалуйста можно ли как нибудь перехватить нажатие Alt или Tab, так чтобы не появлялась табличка выбора окна? |
| Автор: Song 15.6.2002, 10:31 |
| Перехватить-то легко, но вопрос не в этом, нужно подменить нажатие т.е. сказать системе что мы ничего не нажимали. Можно выключить комбинацию черех хук или горячую клавишу. Подробности в MSDN'е или SDK в Дельфи. Однако в NTях по-моему не выйдет. Всё это справедливо для Ctrl+ESC и Alt+Tab, но не для CAD. |
| Автор: RA 15.6.2002, 10:38 |
| 1 FormStyle:=fsStayOnTop; 2 отключи ALT+CTRL+DEL SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,nil,0) потом если надо вруби SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,nil,0) хотя второго будет достаточно. |
| Автор: Song 15.6.2002, 10:41 |
| Дело в том, что отключение CAD таким образом может быть только в W9x,Me. И при этом комбинация Alt+Tab (её нужно было временно отключить, а не CAD) отключается вообще т.е. и переключаться не будет но и ловиться тоже. Вот такие дела. |
| Автор: Song 15.6.2002, 10:46 | ||
на onKeyPress Shift перехватить невозможно. |
| Автор: Spawn 15.6.2002, 10:58 | ||||
Сорри перепутал - OnKeyDown |
| Автор: Spawn 15.6.2002, 11:00 | ||
а так можно: if not (csDesigning in ComponentState) then RegisterServiceProcess(GetCurrentProcessID, 1); ? |
| Автор: Song 15.6.2002, 11:02 | ||
Ну.. в onKeyDown Alt перехватить не сложно: IF ssAlt in Shift then ShowMessage('Нажата клавиша Alt'); |
| Автор: Spawn 15.6.2002, 11:11 | ||
WM_HOTKEY? |
| Автор: Song 15.6.2002, 11:16 |
| Ага, RegisterHotKey()+WM_HOTKEY |
| Автор: Spawn 15.6.2002, 12:17 |
| К примеру я регистрирую 'горячую клавишу': ... procedure TForm1.FormCreate(Sender: TObject); begin RegisterHotKey(Handle,id_AltTab,MOD_ALT,VK_TAB); end; ... Как можно узнать идентификатор id_AltTab?(это будет суммой десятичного значения Alt и Tab?) |
| Автор: Spawn 15.6.2002, 13:24 |
| Я тут порылся в Help'e и наткнулся на GlobalAddAtom - при помощи этой функции можно получить идентификатор 'hot key'? |
| Автор: Spawn 15.6.2002, 14:40 |
| Кто-нибудь может вкратце объяснить, что такое ATOM. |
| Автор: Vit 15.6.2002, 16:08 |
| Атом - "поименнованный" кусочек памяти доступный всем процессам для передачи небольшого куска информации из одной программы в другую. |
| Автор: Song 16.6.2002, 09:36 |
| Vit писал недавно пример взятый с мастаков как зарегистрировать горячую клавишу. По-моему там всё доступно обяснено... |
| Автор: Spawn 16.6.2002, 19:09 |
| Я попробовал зарегистрировать Alt+F4 - там все было ОК, но при регистрации HotKey Alt+Tab эту комбинацию все равно можно нажать: procedure TForm1.hotykey(var msg:TMessage); begin if (msg.LParamLo=MOD_ALT) and (msg.LParamHi=VK_TAB) then begin ShowMessage('Alt + Tab Pressed'); end; end; procedure TForm1.FormCreate(Sender: TObject); begin id:=GlobalAddAtom('hotkey'); RegisterHotKey(handle,id,mod_ALT,VK_TAB); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnRegisterHotKey(handle,id); end; В чем ошибка? |
| Автор: Song 16.6.2002, 19:53 |
| В смысле что она ловится, но приложения всё-равно переключаются ? |
| Автор: Spawn 16.6.2002, 20:28 | ||
По моему Alt+Tab вообще не ловится, поскольку ShowMessage не появляется! |
| Автор: Song 16.6.2002, 20:46 |
| А сообщение WM_HOTKEY в описании класса формы описал ? |
| Автор: Spawn 16.6.2002, 20:50 | ||
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } protected procedure HotKey(var msg:TMessage); message WM_HOTKEY; end; |