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

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

работа в горячей клавишей...


vegarulez ©   (2009-01-16 11:43:00) 

Привет всем мастерам, подскажите как сделать горячую клавишу, но только чтобы он работала только когда форма приложения активна, т.е. если пользователь сделал активным любое другое приложение горячая клавиша не работала в этом случае и не перехватывала нажатие. сечас делаю вот таким образом, но она ловит любое нажатие.
кстати ещё попутный вопрос почему ALT+F10 работает на ура а при ALT + Enter (VK_Return) - не работает?

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
 procedure WM_HotKeyHandler (var Message: TMessage);message WM_HOTKEY;
   { Private declarations }
 public
 keyid:integer;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
var
idHotKey: integer; //идентификатор, но об этом - позже
fuModifiers: word; //модификатор MOD_XX
uVirtKey: word; //код виртуальной клавиши VK_XX
begin
// параметры сообщения получаем так:
idHotkey:= Message.wParam;
fuModifiers:= LOWORD(Message.lParam);
uVirtKey:= HIWORD(Message.lParam);

//теперь - небольшая проверочка:
if (fuModifiers = MOD_ALT) AND (uVirtKey = VK_F10) then
caption:='Alt-F10 нажата';
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
keyid:=GlobalAddAtom('My Hotkey'); //создаем атом
RegisterHotKey(handle,
// сообщение о HotKey будет получать форма
keyid, // регистрируем атом как id
MOD_SHIFT,// модификатор у нас - клавиша Alt
VK_RETURN//VK_F10 // вирт. клавиша - F10
);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnregisterHotKey(handle, keyid);
GlobalDeleteAtom(keyid);
end;

end.


vegarulez   (2009-01-16 13:33:00) [1]

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if key=VK_RETURN then
caption:='Нажат Ентер';
end;


результат=0

а вот в онкэйап - заработало )
спасиб.


vegarulez   (2009-01-16 13:33:00) [2]

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if key=VK_RETURN then
caption:='Нажат Ентер';
end;


результат=0

а вот в онкэйап - заработало )
спасиб.


Правильный$Вася   (2009-01-16 12:43:00) [3]

Use the OnKeyPress event handler to make something happen as a result of a single character key press.

The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that don't correspond to an ASCII Char value (Shift or F1, for example) don't generate an OnKeyPress event. Key combinations (such as Shift+A), generate only one OnKeyPress event (for this example, Shift+A results in a Key value of “A” if Caps Lock is off). To respond to non-ASCII keys or key combinations, use the  OnKeyDown or OnKeyUp event handlers.


vegarulez   (2009-01-16 11:50:00) [4]

Нашёл для приложения вот такой способ:

Перехват нажатий клавиши внутри приложения.  *  *    

Задача решается очень просто. Можно у формы установить свойство KeyPreview в True и обрабатывать событие OnKeyPress.


всё сделал, но чот не работает...  :(


Наверх

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