Как отловить нажатие клавиши в любом месте формы
Как известно, чтобы отловить нажатие клавиши клавиатуры, нужно использовать события KeyPress, KeyDown, и KeyUp. Однако, бывает ситуация, когда мы не знаем на каком элементе формы будет установлен «фокус». Назначать событие на каждый элемент формы — это конечно глупо. Поэтому в этой краткой статье я записал для себя (и тех, кто прочтет) памятку о том, как отловить нажатие клавиши какой бы элемент формы не был активным.
Событие нажатия клавиши на клавиатуре на любом элементе формы
Для того, чтобы форма получала все события клавиш на каком бы активном элементе они не были нажаты, нужно всего лишь установить свойство формы KeyPreview = true. Тогда все события сналача будет получать форма, а затем передавать управление событиям, назначенным элементам.
Как отловить нажатие двух клавиш одновременно на javascript?
(ctrl|shift|alt)Key не предлагать.
В идеале, конечно, узнать бы без обработчика, в произвольном месте кода (в моем случае из requestAnimationframe ), какие клавиши в данный момент нажаты. Но подойдет и, гм, обработчик подобного события, если это вообще реализуемо. Единственное, что мне пришло в голову — это в onkeydown собирать в очередь нажатые клавиши, а в requestAnimationframe эту очередь разбирать.
Но если одна клавиша зажата, то нажатие других keydown не ловит. (
Faq как отловить нажатия клавиш для всех процессов в системе?
Подскажите плиз.
Отправлено: 16.04.2005, 19:06 |
Группа: Участник
Сообщений: 383
CODE |
#define WM_KEYPRESS WM_HOTKEY //. private : int KeyAtom; void __fastcall OnHotKeyPress(TMessage &Message); public : |
В модуле :
CODE |
//Где-то, например в OnCreate KeyAtom = GlobalAddAtom(«HotKey»); RegisterHotKey(Handle, KeyAtom, MOD_CONTROL | MOD_ALT, VK_DELETE); //Обработчик сообщения ModKey = LOWORD(Message.LParam); if ((ModKey == MOD_ALT | MOD_CONTROL)) & (VirtualKey == VK_DELETE)) //Где-то, например в OnDestroy |
Поидее всё. Конечно это не лучший вариант, но должен работать. Кстати без какой-либо библиотеки
Отредактировано Sl@Sh — 16/04/2005, 19:08
#define Unit1H
//—————————————————————————
#include
#include
#include
#include
#define WM_KEYPRESS WM_HOTKEY
//—————————————————————————
class TForm1 : public TForm
<
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
private:
int KeyAtom;
void __fastcall OnHotKeyPress(TMessage &Message);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER( WM_KEYPRESS, TMessage, OnHotKeyPress )
END_MESSAGE_MAP(TComponent)
>;
//—————————————————————————
extern PACKAGE TForm1 *Form1;
//—————————————————————————
Unit1.cpp
CODE |
#include #pragma hdrstop ModKey = LOWORD( Message.LParam ); if( (ModKey == MOD_ALT | MOD_CONTROL) & (VirtualKey == VK_DELETE) ) |
не работает! В ХР, по крайней мере. Таскмэнеджер все равно появляется.
<
MessageBox( 0, «XpeH», «Bom», MB_OK );
>
Выводится сообщение. Так я, почему-то, и думал сразу. Кстати, OnHotKeyPress под ХР вообще не срабатывает. На 9х не пробовал, нету. Может, это только для ХР справедливо И, на самом деле, не понимаю вообще взаимосвязь между регистрированием атома и объявлением своей функции обработки нажатия клавиш
Отредактировано FataLL — 17/04/2005, 13:35
ID горячей клавиши может лежать в разных диапазонах. Всё зависит от того, где его используют. Функция GlobalAddAtom (а точнее её возвращ. значение) используеться, чтобы избежать конфликтов между гор. клавишами различных процессов.
Кстати, у меня ХР, и всё работает нормально
А кто вам сказал, что он должен появиться ?
Я написал пример перехвата клавиш, а дальше дело за вами.
В постановке вопроса именно это и было.
to genchik
Совсем не обязательно горячую клавишу отлавливать. Тем более, что диспетчер задач может запуститься раньше (я не проверял, но поидее так будет), чем ваша прога среагирует.
Можно просто ловить окно диспетчера, а когда словили — временно (пока ваш код выполняется), спрятать. Потом только показать
Успехов вам и genchik и FataLL !
Отправлено: 18.04.2005, 11:56 |
Группа: Модератор
Сообщений: 545
Отправлено: 19.04.2005, 02:07 |
Группа: Участник
Сообщений: 8
Отправлено: 19.04.2005, 10:23 |
Группа: Модератор
Сообщений: 874