Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Внизперехват клавиш? Найти похожие ветки
← →
shelest (2004-06-04 10:52) [0]как перехватить одновременное нажатие Ctrl+Shift+S?
Если учесть, что программа обработки перехвата будет неактивна.
Посмотрел несколько примеров, там все идет только для нажатия одной клавиши.
← →
stany © (2004-06-04 10:59) [1]Глобальный хук в dll. Инфы по этому море.
← →
Игорь Шевченко © (2004-06-04 11:04) [2]RegisterHotkey
← →
shelest (2004-06-04 11:09) [3]С этим проблем нет.
У меня вот только вопрос.
Как реализовать механизм отловки всех трех клавиш?
Chr(Message.wParam) показывает только на нажатие одной клавиши.
ТО есть я так понял, что мне надопоочередно в интервале времени отслеживать нажатие каждой клавиши по отдельности?
← →
shelest (2004-06-04 11:10) [4]RegisterHotkey не прокатит. Мне отслеживать надо во всех приложениях. И особенно в тех которые выдавили из себя ошибку.
← →
stany © (2004-06-04 11:49) [5]перехват 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.
← →
iat (2004-06-04 11:51) [6]вставляешь в класс
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) [7]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.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c