Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как перехватить нажатие определённых клавиш


Автор: начинающий_на_Дельфи 12.7.2004, 13:32
Подскажите, пожалуйста, как перехватить нажатие определённых клавиш, когда активно не твоё приложение.

Автор: Albinos_x 12.7.2004, 13:40
Цитата
procedure TForm1.FormCreate(Sender: TObject);
begin
// регистрирую горячие клавиши приложения
//левый Alt и BackSpace (кнопка [ <- ])
RegisterHotKey(Handle,40,MOD_ALT,8);
end;


А вообще здесь есть тема, не помню как называется, там я подробнее пример делаю

Автор: начинающий_на_Дельфи 12.7.2004, 22:48
Как пользоваться тем, что зарегистрировал?

Автор: Albinos_x 13.7.2004, 00:31
Цитата
private
    { Private declarations }
    procedure WMHotKey(var a:TWMHotKey); message WM_HOTKEY;
....

  public
.....
procedure TForm1.WMHotKey(var a:TWMHotKey);
begin
if (a.HotKey=40)  then
  begin
  // здесь пишешь, то что тебе надо выполнить
  end;
end;
....
UnregisterHotKey(Handle,27);// перед закрытием приложения, убираеш регистрацию
...
end.

Автор: <Spawn> 13.7.2004, 07:25
начинающий_на_Дельфи Так же можно воспользоваться хуком. Делай поиск по функциям SetWindowsHookEx, CallNextHookEx, UnHookWindowsHookEx

Автор: начинающий_на_Дельфи 13.7.2004, 08:39
Дело сдвинулось, большое спасибо!!! А этими функциями я хотел воспользоваться, но не нашёл их точного описания.

Автор: Medved 13.7.2004, 09:04
М
 
Один топик - один вопрос. Не нарушайте пожалуйста правила форума. Тема разделена!

Автор: Gwire 13.5.2011, 00:48
Походу "разбирательства" возник вопрос:
Код

function ProcHook(Code, WParam, LParam: Integer): Integer; stdcall;
begin
    Writeln( Code, #9, WParam, #9, LParam );
    Result := CallNextHookEx(H, Code, WParam, LParam);
end;

procedure SetHook(Hook: TFNHookProc);
begin
    H := SetWindowsHookEx(WH_KEYBOARD, ProcHook, HInstance, 0);
end;


Вопроос:
Если SetWindowsHookEx натравить на HInstance основной программы,
а не DLL-ки то процедера ProcHook не вополняется.
Как это понимать, Почему ей не подходит HInstance основной программы?

Автор: bems 13.5.2011, 14:52
Потому что для выполнения процедуры хука в чужом процессе (там где произошло перехватываемое событие) нужно загрузить в него эту процедуру. Поскольку другого способа кроме как загрузить туда длл в системе не предусмотрено, то процедура хука должна быть в длл, и в SetWindowsHookEx нужно указать какую именно длл нужно загружать (длл идентифицируется своим HMODULE, он же HINSTANCE, он же указатель на начало длл в памяти)

Автор: MetalFan 13.5.2011, 18:03
Вместо HInstance указать 0, далее в сл.параметре вместо 0 (ThreadID) указать GetCurrentThreadID. 

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