Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

перехват клавиш? [D7, WinXP]


shelest ©   (2004-06-04 10:52:00) 

как перехватить одновременное нажатие Ctrl+Shift+S?

Если учесть, что программа обработки перехвата будет неактивна.

Посмотрел несколько примеров, там все идет только для нажатия одной клавиши.


iat   (2004-06-04 11:51:00) [1]

вставляешь в класс
 protected
   procedure hotykey(var msg:TMessage); message WM_HOTKEY;
 ...

var
 id:Integer;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  id:=GlobalAddAtom('hotkey');
// для fsModifiers и т.д. смотри help для RegisterHotKey
  RegisterHotKey(handle, id, fsModifiers, vk);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(handle,id);
end;

procedure TfrmMain.hotykey(var msg:TMessage);
begin
  if (msg.LParamLo= fsModifiers) and (msg.LParamHi= vk) then
  begin
    {do something}
  end;
end;


Игорь Шевченко   (2004-06-04 11:51:00) [2]

shelest   (04.06.04 11:10)


> RegisterHotkey не прокатит


Куды ж он нафиг денется ?

Для примера - ловится нажатие Alt+F1:

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TfMain = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormDestroy(Sender: TObject);
 private
   FKeyAtom: ATOM;
   procedure WMHotkey (var Message: TMessage); message WM_HOTKEY;
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.FormCreate(Sender: TObject);
begin
 FKeyAtom := GlobalAddAtom('MyHotkey');
 Win32Check(RegisterHotKey(Handle, FKeyAtom, MOD_ALT, VK_F1));
end;

procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 UnregisterHotkey(Handle, FKeyAtom);
end;

procedure TfMain.WMHotkey(var Message: TMessage);
begin
 Windows.MessageBox(HWND_DESKTOP, 'Gotcha', 'HOTKEY', MB_OK);
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
 GlobalDeleteAtom(FKeyAtom);
end;

end.


stany   (2004-06-04 11:49:00) [3]

перехват CTRL+ALT+SHIFT


library hook_dll;

uses
Hook in 'hook.pas',

exports
{global hook}
SetKeyboardHook, RemoveKeyboardHook,
begin
end.

unit Hook;

interface

uses Windows, Messages;

function SetKeyboardHook: Boolean; stdcall;
function RemoveKeyboardHook: Boolean; stdcall;
var
KeyboardHook: HHOOK;

implementation

function KeyboardProc(hCode: Integer; wParam: Longint; lParam: Longint): LRESULT; stdcall;
begin
if hCode = HC_ACTION then
if (Word(GetKeyState(VK_MENU)) and (Word(GetKeyState(VK_SHIFT)) and Word(GetKeyState(VK_CONTROL))) and $8000)<>0 then
windows.Beep(70,30);
Result := CallNextHookEx(KeyboardHook, hCode, wParam, lParam);
end;

function SetKeyboardHook: Boolean; stdcall; export;
begin
KeyboardHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
Result := KeyboardHook <> 0;
end;

function RemoveKeyboardHook: Boolean; stdcall; export;
begin
Result := UnhookWindowsHookEx(KeyboardHook);
end;

end.


shelest   (2004-06-04 11:10:00) [4]

RegisterHotkey не прокатит. Мне отслеживать надо во всех приложениях. И особенно в тех которые выдавили из себя ошибку.


shelest   (2004-06-04 11:09:00) [5]

С этим проблем нет.

У меня вот только вопрос.

Как реализовать механизм отловки всех трех клавиш?

Chr(Message.wParam) показывает только на нажатие одной клавиши.
ТО есть я так понял, что мне надопоочередно в интервале времени отслеживать нажатие каждой клавиши по отдельности?


Игорь Шевченко   (2004-06-04 11:04:00) [6]

RegisterHotkey


stany   (2004-06-04 10:59:00) [7]

Глобальный хук в dll. Инфы по этому море.


Наверх

Титульная страница Поиск, карта сайта Написать письмо