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

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

Отлов нажатия определенной комбинации клавиш [D7, 2003]


Страницы:   1 2

cruiser ©   (2008-09-19 13:03:00) 

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


Dennis I. Komarov   (2008-09-19 14:48:00) [1]


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

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


cruiser   (2008-09-19 14:45:00) [2]

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


Vlad Oshin   (2008-09-19 14:40:00) [3]

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

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:30:00) [4]

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


Vlad Oshin   (2008-09-19 14:22:00) [5]


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

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


cruiser   (2008-09-19 14:16:00) [6]

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


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

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


Dennis I. Komarov   (2008-09-19 14:15:00) [8]

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


cruiser   (2008-09-19 14:15:00) [9]

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


Vlad Oshin   (2008-09-19 14:13:00) [10]

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

 if GetForegroundWindow<>Form3.Handle then exit;


cruiser   (2008-09-19 14:08:00) [11]

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


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


> + HotKey

Пардонс, ShortCut


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

Чьемс?


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

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


Dennis I. Komarov   (2008-09-19 13:49:00) [14]

ИМХО TAction + HotKey,  ибо

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


cruiser   (2008-09-19 13:42:00) [15]

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


Vlad Oshin   (2008-09-19 13:39:00) [16]

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


cruiser   (2008-09-19 13:32:00) [17]

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


Vlad Oshin   (2008-09-19 13:30:00) [18]


> 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:20:00) [19]

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


Vlad Oshin   (2008-09-19 13:18:00) [20]

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;


Страницы:   1 2

Наверх

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