Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват нажатия Alt+Tab, Возможно ли это... 
:(
    Опции темы
Spawn
  Дата 15.6.2002, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Я пробую написать небольшую прогу для блокировки Винды(появляется табличка с просьбой ввода парля), но у меня возникла проблема: так как при нажатии кнопок 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, так чтобы не появлялась табличка выбора окна?
PM MAIL   Вверх
Song
Дата 15.6.2002, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Перехватить-то легко, но вопрос не в этом, нужно подменить нажатие т.е. сказать системе что мы ничего не нажимали.
Можно выключить комбинацию черех хук или горячую клавишу. Подробности в MSDN'е или SDK в Дельфи. Однако в NTях по-моему не выйдет. Всё это справедливо для Ctrl+ESC и Alt+Tab, но не для CAD.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
RA
Дата 15.6.2002, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



1 FormStyle:=fsStayOnTop;

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

хотя второго будет достаточно.
PM   Вверх
Song
Дата 15.6.2002, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Дело в том, что отключение CAD таким образом может быть только в W9x,Me. И при этом комбинация Alt+Tab (её нужно было временно отключить, а не CAD) отключается вообще т.е. и переключаться не будет но и ловиться тоже. Вот такие дела.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Song
Дата 15.6.2002, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



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

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


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 15.6.2002, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



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

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

Сорри перепутал  - OnKeyDown :)
PM MAIL   Вверх
Spawn
Дата 15.6.2002, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Цитата(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);
?
PM MAIL   Вверх
Song
Дата 15.6.2002, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Цитата(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');


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 15.6.2002, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



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

WM_HOTKEY?
PM MAIL   Вверх
Song
Дата 15.6.2002, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Ага,
RegisterHotKey()+WM_HOTKEY


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 15.6.2002, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



К примеру я регистрирую 'горячую клавишу':
...
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle,id_AltTab,MOD_ALT,VK_TAB);
end;
...
Как можно узнать идентификатор id_AltTab?(это будет суммой десятичного значения Alt и Tab?)
PM MAIL   Вверх
Spawn
Дата 15.6.2002, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Я тут порылся в Help'e и наткнулся на GlobalAddAtom - при помощи этой функции можно получить идентификатор 'hot key'?
PM MAIL   Вверх
Spawn
Дата 15.6.2002, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Кто-нибудь может вкратце объяснить, что такое ATOM.
PM MAIL   Вверх
Vit
Дата 15.6.2002, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Атом - "поименнованный" кусочек памяти доступный всем процессам для передачи небольшого куска информации из одной программы в другую.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 16.6.2002, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Vit писал недавно пример взятый с мастаков как зарегистрировать горячую клавишу. По-моему там всё доступно обяснено...


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 16.6.2002, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Я попробовал зарегистрировать 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
PM MAIL   Вверх
Song
Дата 16.6.2002, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



В смысле что она ловится, но приложения всё-равно переключаются ?


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 16.6.2002, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



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

По моему Alt+Tab вообще не ловится, поскольку ShowMessage не появляется!
PM MAIL   Вверх
Song
Дата 16.6.2002, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



А сообщение WM_HOTKEY в описании класса формы описал ?


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Spawn
Дата 16.6.2002, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Цитата(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;
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.