Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите HOOK CTRL+INS+INS


Flex ©   (2003-06-18 15:55:00) 

Добрый день уважаемые программисты!

Помогите пожалуйста, мне нужно написать HOOK клавиатуры, который будет отлавливать
комбинацию клавиш Ctrl+INS+INS.

В System tray будет висеть обычный агент, которые должен отлавливать Ctrl+INS+INS

Я так понимаю, что события WM_KEYUP и WM_KEYDOWN будут отлавливаться через WindowProc.

Задача кажеться тривиальной, меня смущает только одно, нет ли более изящного кода, для
подобного рода комбинаций клавиш, когда одна и таже клавиша повторяется несколько раз.

Мой предварительный вариант представлен ниже.
Если есть какие-то рекомендации по реализации подобных вещей, буду очень признателен.


unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
FL:boolean; //Флаг нажатия на клавишу Ctrl+Ins
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
KeyPreview:=True; //Форма будет получать события клавиатуры перед
//активным элементом управления
FL:=False; //инициализация флага
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) then begin
if Key=VK_INSERT then begin
if FL then begin
Showmessage("Ctrl+INS+INS");
FL:=False;
Exit
end; //end FL
FL:=True;
end else FL:=False; //end Key=VK_INSERT
end //end (ssCtrl in Shift)
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not (ssCtrl in Shift) then FL:=False
end;

end.


Заранее благодарен.


Flex   (2003-06-18 18:24:00) [1]


> if (ssCtrl in Shift) then begin
> if Key=VK_INSERT then begin
> if FL then begin
> Showmessage("Ctrl+INS+INS");
> FL:=False;
> Exit
> end; //end FL
> FL:=True;
> end else FL:=False; //end Key=VK_INSERT
> end вот здесь//end (ssCtrl in Shift)
> :)))

К данному случаю был код:

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not (ssCtrl in Shift) then FL:=False
end;


Хотя последний вариант, намного грамотнее.


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=VK_INSERT) then begin
if FL then Showmessage("Ctrl+INS+INS");
( ssCtrl in Shift)


> if (ssCtrl in Shift) then begin
> if Key=VK_INSERT then begin
> if FL then begin
> Showmessage("Ctrl+INS+INS");
> FL:=False;
> Exit
> end; //end FL
> FL:=True;
> end else FL:=False; //end Key=VK_INSERT
> end вот здесь//end (ssCtrl in Shift)
> :)))

К данному случаю был код:

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not (ssCtrl in Shift) then FL:=False
end;


Хотя последний вариант, намного грамотнее.


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=VK_INSERT) then begin
if FL then Showmessage("Ctrl+INS+INS");
FL:=not FL
end else FL:=False//end (ssCtrl in Shift) and (Key=VK_INSERT)
end;



han_malign   (2003-06-18 17:51:00) [2]

> Где не хватает флага?
if (ssCtrl in Shift) then begin
if Key=VK_INSERT then begin
if FL then begin
Showmessage("Ctrl+INS+INS");
FL:=False;
Exit
end; //end FL
FL:=True;
( ssCtrl in Shift)

> Где не хватает флага?
if (ssCtrl in Shift) then begin
if Key=VK_INSERT then begin
if FL then begin
Showmessage("Ctrl+INS+INS");
FL:=False;
Exit
end; //end FL
FL:=True;
end else FL:=False; //end Key=VK_INSERT
end вот здесь//end (ssCtrl in Shift)
:)))
([Ctrl+Ins+Ins] <> [Ctrl+Ins Ctrl+Ins])


Flex   (2003-06-18 17:32:00) [3]


> кстати одного FL:=False не хватает (if (ssCtrl in Shift)
> then)




procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=VK_INSERT) then begin
if FL then Showmessage("Ctrl+INS+INS");
( ssCtrl in Shift)


> кстати одного FL:=False не хватает (if (ssCtrl in Shift)
> then)




procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=VK_INSERT) then begin
if FL then Showmessage("Ctrl+INS+INS");
FL:=not FL
end else FL:=False//end (ssCtrl in Shift) and (Key=VK_INSERT)
end;


Где не хватает флага?
Все работает...


han_malign   (2003-06-18 16:17:00) [4]

кстати одного FL:=False не хватает (if (ssCtrl in Shift) then)

З.Ы. Можно сократить
if (ssCtrl in Shift)and(Key=VK_INSERT) then begin
( "Ctrl+INS+INS")

кстати одного FL:=False не хватает (if (ssCtrl in Shift) then)

З.Ы. Можно сократить
if (ssCtrl in Shift)and(Key=VK_INSERT) then begin
if FL then Showmessage("Ctrl+INS+INS");
FL:=not FL;
end else FL:=False;


Наверх

Титульная страница Поиск, карта сайта Написать письмо