![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Пожалуйста, помогите советом. Пытаюсь написать компонент (невизуальный), который при нажатии определенной комбинации
клавиш (комбинацию в будущем планируется задаваться в свойсве), выполнил событие пользователя. Как заставить компонент перехватывать нажатия клавиш и реагировать только на назначенные? (перехватывать сообщение с помощью WM_HOTKEY не получилось, также пытался перекрыть WndProc и там отлаливать WM_HOTKEY-безрезультатно...пока остановился на обработке сообщений формы Application.OnMessage, но и тут напоролся на непонятную ошибку... ![]() |
#2
|
|||
|
|||
![]() Вот некоторые мои эксперименты:
Код:
private procedure WMHotKey(var Message: TMessage); message WM_HOTKEY; var id : DWORD; procedure TForm1.FormActivate(Sender: TObject); Const VK_D = 68; begin id:= GlobalAddAtom('Hotkey1'); RegisterHotKey(Form1.Handle, id, MOD_CONTROL, VK_D); end; procedure TForm1.WMHotKey(var Message: TMessage); begin Showmessage('Нажаты Ctrl+d'); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnregisterHotKey(Form1.Handle, id); end; |
#3
|
|||
|
|||
![]() Цитата:
![]() |
#4
|
|||
|
|||
![]() Ага, понял в чем проблема.
На самом деле не ловит, потому-что тип компонента, который ты видимо делаешь, не является оконным. Обычно это обходится путем использования окна, на которое "бросается" компонент. В этом случае ты должен сохранить ссылку на существующую WndProc и заменить ее на свою. А в своей проверить на WM_HOTKEY, и если нет, то вызвать сохраненную. Или делать компонент наследником любого оконного (не уверен, что совсем любого, может сообщение посылается только топ-левел окнам), либо просто создавать свое невидимое окно, как делает TTimer. |
#5
|
||||
|
||||
![]() У него оконный компонент и даже была попытка перехватить WndProc, но видно не получилось.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
|||
|
|||
![]() Цитата:
Ну, тогда только к хирургу, или к кузнецу - руки выпрямлять. Кстати, на torry.net можно посмотреть компонент HotKeyManager. Как раз то, что товарисч хочет сделать. ЗЫ. Как я и сказал, TWinControl похоже не годится, нужен TWindow, хотя там вообще намешано - зачем делать оконный компонент, если все-равно перехватываешь сообщение у родительского окна? В общем - ссылку на пример дал - разбирайтесь. Последний раз редактировалось lmikle, 04.01.2012 в 00:54. |