![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отлов нажатия определенной комбинации клавиш [D7, 2003]
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;