Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Spawn @ 15.6.2002, 10:36)
(В событие OnKeyPress получалось перехватить к примеру Shift, но при нажатии Alt ни какой реакции не было )

на onKeyPress Shift перехватить невозможно.

Автор: Spawn 15.6.2002, 10:58
Цитата(Song @ 15.6.2002, 11:46)
Цитата(Spawn @ 15.6.2002, 10:36)
(В событие OnKeyPress получалось перехватить к примеру Shift, но при нажатии Alt ни какой реакции не было )

на onKeyPress Shift перехватить невозможно.

Сорри перепутал  - OnKeyDown :)

Автор: Spawn 15.6.2002, 11:00
Цитата(RAdmin @ 15.6.2002, 11:38)
1 FormStyle:=fsStayOnTop;

2 отключи ALT+CTRL+DEL
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,nil,0)
потом если надо вруби
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,nil,0)

хотя второго будет достаточно.

а так можно:
if not (csDesigning in ComponentState) then
   RegisterServiceProcess(GetCurrentProcessID, 1);
?

Автор: Song 15.6.2002, 11:02
Цитата(Spawn @ 15.6.2002, 11:58)
[quote=Song,15.6.2002,11:46][quote=Spawn,15.6.2002,10:36]
Сорри перепутал  - OnKeyDown :)

Ну.. в onKeyDown Alt перехватить не сложно:

IF ssAlt in Shift then ShowMessage('Нажата клавиша Alt');

Автор: Spawn 15.6.2002, 11:11
Цитата(Song @ 15.6.2002, 11:31)
... или горячую клавишу...

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;

В чем ошибка? :notify

Автор: Song 16.6.2002, 19:53
В смысле что она ловится, но приложения всё-равно переключаются ?

Автор: Spawn 16.6.2002, 20:28
Цитата(Song @ 16.6.2002, 20:53)
В смысле что она ловится, но приложения всё-равно переключаются ?

По моему Alt+Tab вообще не ловится, поскольку ShowMessage не появляется!

Автор: Song 16.6.2002, 20:46
А сообщение WM_HOTKEY в описании класса формы описал ?

Автор: Spawn 16.6.2002, 20:50
Цитата(Song @ 16.6.2002, 21:46)
А сообщение WM_HOTKEY в описании класса формы описал ?

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)