Faq как отловить нажатия клавиш для всех процессов в системе


Как отловить нажатие клавиши в любом месте формы

Как известно, чтобы отловить нажатие клавиши клавиатуры, нужно использовать события KeyPress, KeyDown, и KeyUp. Однако, бывает ситуация, когда мы не знаем на каком элементе формы будет установлен «фокус». Назначать событие на каждый элемент формы — это конечно глупо. Поэтому в этой краткой статье я записал для себя (и тех, кто прочтет) памятку о том, как отловить нажатие клавиши какой бы элемент формы не был активным.

Событие нажатия клавиши на клавиатуре на любом элементе формы

Для того, чтобы форма получала все события клавиш на каком бы активном элементе они не были нажаты, нужно всего лишь установить свойство формы KeyPreview = true. Тогда все события сналача будет получать форма, а затем передавать управление событиям, назначенным элементам.

Как отловить нажатие двух клавиш одновременно на javascript?

(ctrl|shift|alt)Key не предлагать.

В идеале, конечно, узнать бы без обработчика, в произвольном месте кода (в моем случае из requestAnimationframe ), какие клавиши в данный момент нажаты. Но подойдет и, гм, обработчик подобного события, если это вообще реализуемо. Единственное, что мне пришло в голову — это в onkeydown собирать в очередь нажатые клавиши, а в requestAnimationframe эту очередь разбирать.

Но если одна клавиша зажата, то нажатие других keydown не ловит. (

Faq как отловить нажатия клавиш для всех процессов в системе?

как можно определить и перехватить нажатие пользователем клавиш Ctrl+Alt+Del, чтобы можно было до стандарного вызова таскмесенджера выполнить нужный код? есть хук, который позволяет залочить клаву и мышь, но по нажатию на эти клавиши все на смарку .

Илон Маск рекомендует:  Услуги аутсорсинга в области компьютерной техники

Подскажите плиз. Sl@Sh

Отправлено: 16.04.2005, 19:06

Группа: Участник
Сообщений: 383

В заголовочном файле :

CODE
#define WM_KEYPRESS WM_HOTKEY
//.
private : int KeyAtom;
void __fastcall OnHotKeyPress(TMessage &Message);

public :
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_KEYPRESS, TMessage, OnHotKeyPress)
END_MESSAGE_MAP(TComponent)

В модуле :

CODE
//Где-то, например в OnCreate
KeyAtom = GlobalAddAtom(«HotKey»);
RegisterHotKey(Handle, KeyAtom, MOD_CONTROL | MOD_ALT, VK_DELETE);

//Обработчик сообщения
void __fastcall TfmMain::OnHotKeyPress(TMessage &Message)
<
unsigned char VirtualKey;
UINT Mod1, Mod2, ModKey;

ModKey = LOWORD(Message.LParam);
VirtualKey = HIWORD(Message.LParam);

if ((ModKey == MOD_ALT | MOD_CONTROL)) & (VirtualKey == VK_DELETE))
<
//.
>
>

//Где-то, например в OnDestroy
UnregisterHotKey(Handle, KeyAtom);
GlobalDeleteAtom(KeyAtom);

Поидее всё. Конечно это не лучший вариант, но должен работать. Кстати без какой-либо библиотеки

Отредактировано Sl@Sh — 16/04/2005, 19:08 CODE #ifndef Unit1H
#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 );
VirtualKey = HIWORD( Message.LParam );

if( (ModKey == MOD_ALT | MOD_CONTROL) & (VirtualKey == VK_DELETE) )
<
MessageBox(
0,
«Ctrl + Alt + Del pressed. «,
«GlobalHook»,
MB_ICONEXCLAMATION | MB_OK
);
>
>
//—————————————————————————

не работает! В ХР, по крайней мере. Таскмэнеджер все равно появляется. CODE if( !RegisterHotKey( Handle, KeyAtom, MOD_CONTROL | MOD_ALT, VK_DELETE ) )
<
MessageBox( 0, «XpeH», «Bom», MB_OK );
>

Выводится сообщение. Так я, почему-то, и думал сразу. Кстати, OnHotKeyPress под ХР вообще не срабатывает. На 9х не пробовал, нету. Может, это только для ХР справедливо И, на самом деле, не понимаю вообще взаимосвязь между регистрированием атома и объявлением своей функции обработки нажатия клавиш

Отредактировано FataLL — 17/04/2005, 13:35 QUOTE (FataLL @ 17/04/2005, 13:29) И, на самом деле, не понимаю вообще взаимосвязь между регистрированием атома и объявлением своей функции обработки нажатия клавиш

ID горячей клавиши может лежать в разных диапазонах. Всё зависит от того, где его используют. Функция GlobalAddAtom (а точнее её возвращ. значение) используеться, чтобы избежать конфликтов между гор. клавишами различных процессов.

Кстати, у меня ХР, и всё работает нормально QUOTE (FataLL @ 17/04/2005, 12:34) не работает! В ХР, по крайней мере. Таскмэнеджер все равно появляется.

А кто вам сказал, что он должен появиться ?
Я написал пример перехвата клавиш, а дальше дело за вами.
В постановке вопроса именно это и было.

to genchik
Совсем не обязательно горячую клавишу отлавливать. Тем более, что диспетчер задач может запуститься раньше (я не проверял, но поидее так будет), чем ваша прога среагирует.

Можно просто ловить окно диспетчера, а когда словили — временно (пока ваш код выполняется), спрятать. Потом только показать

Успехов вам и genchik и FataLL ! Konstantine

Отправлено: 18.04.2005, 11:56

Группа: Модератор
Сообщений: 545

а вообще, если верить мелкософту, то Ctrl+Alt+Del не перехватываются. — для этого и заставляет перед вводом пассворда при входже в систему (для nt/2k/xp) нажимать сию комбинацию genchik
Отправлено: 19.04.2005, 02:07

Группа: Участник
Сообщений: 8

Спасибо за активное участие. Хорошо было бызапихать перехват в ДЛЛ. В принципе суть не в том, чтобы залочить эти клавиши. Надо просто компы лочить в салоне, но процесс программы можно убить в таксмесенжере, для этого и понадобилось перехватывать эти нажатия. Может есть варианты для другой блокировки? скрывать процесс нельзя по некоторым соображениям Георгий
Отправлено: 19.04.2005, 10:23

Группа: Модератор
Сообщений: 874

у нас где то в FAQ было как сделать программу не убиваемой. там предлагалось получив сообщение от винды о закрытии программы запускать свою копию.
Илон Маск рекомендует:  Автоупаковка и автораспаковка
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL