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

Вниз

Отлов нажатия определенной комбинации клавиш   Найти похожие ветки 

 
cruiser ©   (2008-09-19 13:03) [0]

Здравствуйте. Подскажите пожалуйста, как сделать отлов программой нажатий определенной комбинации клавиш, например Ctrl+anykey или Shift+anykey ? Причем мониторинг нажатий должен быть постоянно.


 
Palladin ©   (2008-09-19 13:08) [1]

где ты их ловить собрался?


 
cruiser ©   (2008-09-19 13:14) [2]

Вопрос не очень понял, но
значит задача поставлена так:
Программа запущена
При нажатии "горячих клавиш" программа на это как-то реагирует (например делает showmessage:) ).
При это остальные функции программы должны работать в штатном режиме


 
Правильный$Вася   (2008-09-19 13:14) [3]

для формы, программы в цедом или даже для всей системы?


 
cruiser ©   (2008-09-19 13:16) [4]

Для формы. Т.е. при активной окне программы.


 
cruiser ©   (2008-09-19 13:17) [5]

программа состоит из одной формы


 
Vlad Oshin ©   (2008-09-19 13:18) [6]

type
 TForm3 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   id1: Integer;
   procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
 public    { Public declarations }
 end;

var
 Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.WMHotKey(var Msg: TWMHotKey);
begin
showmessage("");
end;

procedure TForm3.FormCreate(Sender: TObject);
const
 MOD_ALT = 1;
 MOD_CONTROL = 2;
 MOD_SHIFT = 4;
 MOD_WIN = 8;
begin
 id1 := GlobalAddAtom("Hotkey-MOD+PTRSCR");
 RegisterHotKey(Handle, id1, MOD_CONTROL+MOD_SHIFT, $5a );
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
    UnRegisterHotKey(Handle, id1);
    GlobalDeleteAtom(id1);
end;


 
cruiser ©   (2008-09-19 13:20) [7]

А прокомментировать можете что и где отрабатывается и при каких нажатиях программа реагирует и как?


 
Vlad Oshin ©   (2008-09-19 13:30) [8]


> id1 := GlobalAddAtom("Hotkey-MOD+PTRSCR");
>  RegisterHotKey(Handle, id1, MOD_CONTROL+MOD_SHIFT, $5a
> );

регистрируется_горячая_клавиша MOD_CONTROL+MOD_SHIFT+$5a (Z, вроде. чего бы не глянуть в хелп? )

procedure TForm3.WMHotKey(var Msg: TWMHotKey);
begin
 if Msg.HotKey = id1
  then
showmessage("");
end;

лишнего стер, извинения


 
cruiser ©   (2008-09-19 13:32) [9]

Спасибо огромное! В хелпе посмотрю. Т.е. получается отрабатываем нажатие Ctrl+Shift+Z ?


 
Vlad Oshin ©   (2008-09-19 13:39) [10]

да, только это будет срабатывать даже когда не активна форма/приложение


 
cruiser ©   (2008-09-19 13:42) [11]

О. Спасибо за дополнение к ответу. Это не очень удобно. А что надо дописать что бы именно при активном окне программы срабатывала комбинация?


 
Dennis I. Komarov ©   (2008-09-19 13:49) [12]

ИМХО TAction + HotKey,  ибо

> cruiser ©   (19.09.08 13:16) [4]
> Для формы. Т.е. при активной окне программы.
> cruiser ©   (19.09.08 13:17) [5]
> программа состоит из одной формы


 
cruiser ©   (2008-09-19 13:51) [13]

Простите, Dennis I. Komarov, а куда это вписать в приведенном выше листинге?


 
Dennis I. Komarov ©   (2008-09-19 14:05) [14]


> + HotKey

Пардонс, ShortCut


> cruiser ©   (19.09.08 13:51) [13]
> Простите, Dennis I. Komarov, а куда это вписать в приведенном
> выше листинге?

Чьемс?


 
cruiser ©   (2008-09-19 14:08) [15]

Не понял вопроса. Вот Vlad Oshin написал листинг для отлова нажатия клавиш. Но как оказывается этот отлов будет работать даже если окно программы неактивно. Я задал вопрос что нужно изменить в листинге, что бы отлов работал только при активном окне программы. На что Вы ответили "ИМХО TAction + HotKey". Я подумал, что это надо где-то прописать в листинге Vlad Oshin или я не правильно Вас понял? Тогда можете привести уже готовый пример как должно быть?


 
Vlad Oshin ©   (2008-09-19 14:13) [16]

если нравится мой листинг :) то воткните в процедуру

 if GetForegroundWindow<>Form3.Handle then exit;


 
cruiser ©   (2008-09-19 14:15) [17]

Спасибо Vlad Oshin. В какую процедуру именно и как должен выглядеть в законченном варианте листинг? Заранее благодарю.


 
Dennis I. Komarov ©   (2008-09-19 14:15) [18]

нет, я отвечал на [0]
И никуда это вставлять не надо. Надо создать экземляр класса TAction и присвоить ему нудное свойство ShortCut. В OnExecute прописать нужные действия...


 
Smile   (2008-09-19 14:16) [19]

Думаю, что при такой постановке вопроса, автора вполне удовлетворит MaiMenu (Visible:= False), с соответствующими ShortCut-ами:)


 
cruiser ©   (2008-09-19 14:16) [20]

Dennis I. Komarov, спасибо тоже за ответ. Но мне бы подробнее с наглядным примером, если можно...


 
Vlad Oshin ©   (2008-09-19 14:22) [21]


> Спасибо Vlad Oshin. В какую процедуру именно и как должен
> выглядеть в законченном варианте листинг? Заранее благодарю

не за что. Тем более не понял я вопроса изначально, так что ответы др. участников предпочтительнее.
По поводу процедуры:
Их там 3 (три). Можно на худой конец подумать самому в какую? Крайняк перебрать, не так много вариантов :)


 
cruiser ©   (2008-09-19 14:30) [22]

Спасибо всем за ответы. Буду пробовать. Мне ещё тут подсказали, что можно с помощью свойства самой формы KeyPreview сделать это. Осуществимо ли это? Если да, то как именно можно сделать такое?


 
Vlad Oshin ©   (2008-09-19 14:40) [23]

Совсем думать не хотите..
Как хотите

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 KeyPreview:=true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin
if (ssShift in Shift) and (ssCtrl in Shift) and (Key=$5a) then  ShowMessage("");
end;

end.


 
cruiser ©   (2008-09-19 14:45) [24]

Огромное спасибо! То что надо!


 
Dennis I. Komarov ©   (2008-09-19 14:48) [25]


> cruiser ©   (19.09.08 14:16) [20]

Это противоречит логики...
Все это очень просто делается даже в DT с VCL, надо просто немного подумать...
ЗЫ TActionList в помощь



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

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

Наверх




Память: 0.53 MB
Время: 0.014 c
15-1220267957
Adventure
2008-09-01 15:19
2008.10.26
Слеить EXE и DLL


2-1221743924
Дмитрий87
2008-09-18 17:18
2008.10.26
Оптимизация


15-1220500439
@!!ex
2008-09-04 07:53
2008.10.26
Как получить список функций из dll?


1-1200983736
frostyland
2008-01-22 09:35
2008.10.26
Как программно скроллировать окно, чтобы сделать видимым контрол?


2-1221557905
Fynjy
2008-09-16 13:38
2008.10.26
как перенести выбранное обозначение в другую форму?