![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перехват клавиш? [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. Инфы по этому море.