Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

Перехват нажатия клавиши 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.09 c
4-1120045400
SPeller
2005-06-29 15:43
2005.08.21
Заставить IE перечитать настройки


3-1121248213
linesoft
2005-07-13 13:50
2005.08.21
Отладчик процедур MS SQL


1-1122719203
Navi
2005-07-30 14:26
2005.08.21
Текст в 2 строки в TreeNode у TreeView


14-1122530561
Ega23
2005-07-28 10:02
2005.08.21
С днем рождения! 28 июля


1-1122989229
Viktop
2005-08-02 17:27
2005.08.21
Сохранение настроек в ini





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский