Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

перехват клавиш?   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
6-1084810197
xman
2004-05-17 20:09
2004.07.18
Sockets


14-1088520033
diablo_m
2004-06-29 18:40
2004.07.18
Ищу типа дизайнера


3-1088177911
peypivo
2004-06-25 19:38
2004.07.18
некоторые вопросы по firebird


6-1084859339
Сергей12
2004-05-18 09:48
2004.07.18
Соединение Client Server


6-1084634898
P@uk
2004-05-15 19:28
2004.07.18
Передать файл по сети