Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2012, 02:26   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию клик мышкой мимо окна

То самое событие, когда мышка была нажата за пределами окна.
интернет на такой запрос отвечает байками про WM_ACTIVATE,
мол, это сообщение посылается, когда окно теряет фокус.
А если мы кликнем мышкой мимо окна, то оно, ведь,
по логике теряет фокус, правильно?
т.е. этому окну будет послано сообщение WM_ACTIVATE.

есть наследник TCustomControl, в нем описываю процедуру:
Код:
procedure Test(var Msg:TMessage);  message WM_ACTIVATE;
ну и ниже ее описание - приводить не буду, ибо нет смысла,
т.к. эта процедура не запускается вообще.
Т.е. не приходит сообщения WM_ACTIVATE, куда не тыкай -
в окно, мимо окна...

а вопрос такой: как зафиксировать событие, когда мышка была нажата мимо конкретного окна?
xrob вне форума Ответить с цитированием
Старый 13.08.2012, 02:42   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Хех, какая у вас странная логика. Если юзер кинул мышку мимо окна, то WM_ACTIVATe летит в того, кому его кинули, а не тому, кому собирались кинуть.

Делайте хук на тыки мышкой и проверяйте, попал или нет юзер в область вашего окна или нет.
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2012, 07:46   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если окно/контрол(!) потеряли фокус, то они получают WM_KILLFOCUS.

если вы хотите сделать типа как у SPy++ выбор окна, то там немного иначе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2012, 08:41   #4
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Если юзер кинул мышку мимо окна, то WM_ACTIVATe летит в того, кому его кинули, а не тому, кому собирались кинуть.
Не только.

WM_ACTIVATE:
Цитата:
Sent to both the window being activated and the window being deactivated.
<...>
WA_INACTIVE Deactivated.
, только ловить это надо не компоненту, а форме, тогда будет получено сообщение о деактивации формы.
volvo877 вне форума Ответить с цитированием
Старый 13.08.2012, 15:21   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

моя логика как раз соответствует тому, что написал volvo877:
сообщение посылается обоим окнам - которое получает фокус и которое теряет фокус...

хотя я тут подумал, даже ЭТО не совсем то что нужно...
кстати с формой такое получалось - WA_INACTIVE, событие происходило,
когда кликал мимо формы, а вот с наследником TCustomControl не прокатывает -
процедура, назначенная на WM_ACTIVATE не запускается вообще, куда не тыкай.

пример того, чего пытаюсь добиться - выпадающий список.
если список открыт, то любое нажатие мышкой вне этого списка приведет к его закрытию.

сразу скажу, мне не нужен именно список, мне нужен сам механизм.


попробовал WM_KILLFOCUS...
это сообщение приходит, когда фокус с моего контрола переходит на другой контрол.
например, если попытаюсь нажать кнопку.
но по форме, например, спокойно можно долбить мышкой и ничего не произойдет.
клик мышкой по форме, почему-то не переносит на нее фокус...


хук на мышку и сравнение - это неплохо, но это уже вмешательство в работу винды,
да и больше смахивает на "костыль", или я ошибаюсь?
а хочется сделать "по-хорошему", т.е. без изврата.
как это, например, сделано в стандартном выпадающем списке?

Последний раз редактировалось xrob; 13.08.2012 в 15:31.
xrob вне форума Ответить с цитированием
Старый 13.08.2012, 15:48   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а вот с наследником TCustomControl не прокатывает -
вы должны вмешаться в обработчик формы, именно она получает INACTIVE поидее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2012, 16:15   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

CM_CANCELMODE...
то, что доктор прописал!
если фокус на моем контроле и мышка нажата мимо него - бинго,
получает это сообщение!

единственный минус - клик мимо программы не приводит к этому событию...
но в остальном - то что нужно! =)
xrob вне форума Ответить с цитированием
Старый 13.08.2012, 16:30   #8
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
а вот с наследником TCustomControl не прокатывает -
процедура, назначенная на WM_ACTIVATE не запускается вообще, куда не тыкай
Дочерние окна не получают WM_ACTIVATE. Только top-level windows.

Цитата:
а хочется сделать "по-хорошему", т.е. без изврата.
как это, например, сделано в стандартном выпадающем списке?
Стандартный комбобокс уведомляет родителя о том, что потерял фокус, посылкой ему уведомления CBN_KILLFOCUS
volvo877 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
клик мышкой при определенном событии legenda1 Общие вопросы Delphi 6 01.02.2012 03:21
TreeView клик мышкой Slukka C# (си шарп) 1 28.05.2011 00:35
Как отследить был ли клик мышкой в приложении? MyLastHit Общие вопросы Delphi 3 20.12.2010 18:23
Выбор окна мышкой Altera Win Api 5 19.05.2010 01:49
Клик мимо итема(Item) в ShellListView zallza Общие вопросы Delphi 2 11.05.2010 15:22