Форум: "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.47 MB
Время: 0.049 c