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

Вниз

Перехват нажатия клавиши CTRL   Найти похожие ветки 

 
leonidus ©   (2005-05-13 14:32) [0]

Мастера подскажите плиз, моя программа висит в трее и мониторит клавиатуру, как только юзер жмет Ctrl программа показывает свое окно. Делаю так:

...
...
 private
   { Private declarations }
  procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
 public
   { Public declarations }
 end;
...

procedure Tform1.WMHotKey(var Message: TMessage);
begin
//нажата Ctrl
ctrl_press:=true;
....
....
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(form1.Handle,123,mod_control, VK_Control);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, 123);
end;

Так вот при такой реализации, программа перехватывает все нажатия Ctrl`а хорошо, но при этом не дает работать другим программам в которых Ctrl также горячая клавиша. Вот и вопрос, как сделать что и программа перехватила нажатие и другим программам работать не мешала.


 
забыл...   (2005-05-13 14:48) [1]

Либо меняй HotKey, либо истользуй Hook(SetWindowsHookEx)


 
GreatMaster   (2005-05-13 14:54) [2]

кароче лови нажатие Ctrl, потом жди отпускания Ctrl и если между ними ничё не нажималось - высовывайся
а ваще на голый Ctrl чёто садить - плохой тон, высовывайся хотябы по двум быстрым нажатиям Ctrl например (типа Double Ctrl гыгы)
а как хоткей её не регистрируй ибо нефиг


 
leonidus ©   (2005-05-14 07:46) [3]

Поменять hotkey не получается, нужно именно Ctrl.
А как реализовать Hook(SetWindowsHookEx), можно поподробнее?


 
_hdd   (2005-05-14 12:08) [4]

Для начала читаешь статью на этом сайте
http://delphimaster.ru/articles/hooks/index.html
Затем создаешь dll-библиотеку и exe-файл. В библиотеке будет ловушка, т.е. хук и из экзешника будем устанавливать и снимать хук. Вот и все.
Ну например
Это библиотека
library Project2;

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

const
 filename: string[15] = "c:\keyboard.txt";
var
 hook: HHOOK;
 wnd: HWND;

function IntToRus(i: word): word;
begin
 case i of
   32: Result := 32;
   65: Result := 212; //a
   66: Result := 200; //b
   67: Result := 209; //c
   68: Result := 194; //d
   69: Result := 211; //e
   70: Result := 192; //f
   71: Result := 207; //g
   72: Result := 208; //h
   73: Result := 216; //i
   74: Result := 206; //j
   75: Result := 203; //k
   76: Result := 196; //l
   77: Result := 220; //m
   78: Result := 210; //n
   79: Result := 217; //o
   80: Result := 199; //p
   81: Result := 201; //q
   82: Result := 202; //r
   83: Result := 219; //s
   84: Result := 197; //t
   85: Result := 195; //u
   86: Result := 204; //v
   87: Result := 214; //w
   88: Result := 215; //x
   89: Result := 205; //y
   90: Result := 223; //z
   192: Result := 168; //Ё
   219: Result := 213; // Х
   221: Result := 218; // Ъ
   186: Result := 198; // Ж
   222: Result := 221; // Э
   188: Result := 193; // Б
   190: Result := 222; // Ю

 end;
end;

procedure WriteToFile(code: byte);
var
 kn: array[0..KL_NAMELENGTH] of char;
 f: textfile;
 str: string;
 i: integer;
begin
 str := "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
 GetKeyboardLayoutName(@kn);
 AssignFile(f, filename);
 if not FileExists(filename) then
 begin
   Rewrite(f);
   CloseFile(f);
 end
 else
 begin
   Append(f);

   if kn = "00000409" then
   begin
     write(f, "<" + inttostr(code) + ">");
   end
   else
   begin
     write(f, char(inttorus(code)));
   end;
   CloseFile(f);
 end;
end;

function HookFunc(code: integer; wParam: word; lParam: longint): longint;
 stdcall;
begin
 Result := CallNextHookEx(hook, code, wParam, lParam);
 if (Code = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then
 begin
   WriteToFile(wParam);
 end;
end;

procedure RunStopHook(b: Boolean) export; stdcall;
begin
 if b then
 begin
   if hook = 0 then
   begin
     hook := SetWindowsHookEx(WH_KEYBOARD, @hookfunc, HInstance, 0);
   end;
 end
 else
 begin
   UnhookWindowsHookEx(hook);
   hook := 0;
 end;
end;

exports RunStopHook index 1;

begin

end.

Это экзешник
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Edit1: TEdit;
   ListBox1: TListBox;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
procedure RunStopHook(b: boolean) stdcall; external "Project2.dll" index 1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 RunStopHook(true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 RunStopHook(false);
end;

end.

Вот и все!!!


 
BestOnix   (2005-06-28 15:04) [5]

> _hdd
Прочитал означенную статью, дошло дело до примеров. Возник вопрос по 3 примеру. Почему нажатия клавиш дублируются. Не подскажете в чем проблема ?


 
alpet ©   (2005-06-28 15:53) [6]

_hdd   (14.05.05 12:08) [4]
>function IntToRus(i: word): word;

Оригинально однако, даже можно не использовать MapVirtualKeyEx. Можно даже вообще обойтись без WinAPI :)


 
Axis_of_Evil ©   (2005-06-28 16:06) [7]

>Почему нажатия клавиш дублируются. Не подскажете в чем
>проблема ?

LRESULT CALLBACK KeyboardProc(          int code,
   WPARAM wParam,
   LPARAM lParam
);

lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user"s holding down the key.



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1122359799
Dust
2005-07-26 10:36
2005.08.21
Имя файла


14-1122718012
Ajax
2005-07-30 14:06
2005.08.21
Экспоненциальное усреднение


14-1122487440
Starcom
2005-07-27 22:04
2005.08.21
Как узнать кто аттакует?


14-1121602423
Blaster
2005-07-17 16:13
2005.08.21
Delphi 2005 - стоитли пробовать?


4-1119697602
Darkwing
2005-06-25 15:06
2005.08.21
Асинхронный I/O