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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.005 c
2-1221740702
Cosinus
2008-09-18 16:25
2008.10.26
Как запретить показ системного меню?


2-1221546073
dmitry_12_08_73
2008-09-16 10:21
2008.10.26
Определение идентификатора потока


2-1221929674
_Image_
2008-09-20 20:54
2008.10.26
Загружено ли изображение в Image


2-1221658980
smartleds
2008-09-17 17:43
2008.10.26
Господа, напомните пожалуйста функцию задержки в Делфи


15-1220164701
Riply
2008-08-31 10:38
2008.10.26
Запись и чтение реестра.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский