[win] Можно ли узнать, куда ушёл фокус с окна?/closed

kill-still

в окно приходит WM_ACTIVATEAPP. в зависимости от того, куда ушел фокус, необходимо произвести различные действия.
проблема в том, что во время этого события форма, куда ушел фокус, ещё не получила WM_ACTIVATEAPP (ну или не обработала соответственно узнать, что под фокусом, таким образом невозможно. Есть ли ещё пути (ну, кроме как очередь сообщений прочитать)?

zorin29

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

kill-still

от в том то и проблема, что надо знать.

kill-still

нашёл функцию user32.GetFocus. В принципе то, что нужно (неудобно правда хендл окна получать, а не ссылку на объект, но то фигня но есть небольшое затруднение - при смене фокуса с MDI чайлда на главную форму возвращается хэнлд чайлда, а не главного окна (если фокус уходит на соседний MDI чайлд, то всё ок). Как бороться с этим нюансом?

kokoc88

Есть вызовы GetForegroundWindow и GetActiveWindow
Но я настоятельно не рекомендую писать логику, которая основана на анализе клавиатурного фокуса. Хоть и бывают ситуации, когда это нужно; но они в основном связаны с реализацией своего собственного элемента управления и работают в его рамках. Анализ передачи фокуса между формами - это извращение.

kill-still

у GetForegroundWindow та же проблема, что и у GetFocus - оно при выделении главной миди формы возвращает её активного миди-чайлда (если таковой имеется) :(
а GetActiveWindow вообще всё время возвращает главную миди.
Но я настоятельно не рекомендую писать логику, которая основана на анализе клавиатурного фокуса
надо поправить поведение старого девэкспресовского грида (вер. 3.1)

kokoc88

У формы есть свойство ActiveMdiChild.
Я не понимаю, как можно выделить главную MDI форму, и что это вообще значит. Ясное дело, что если есть активное дочернее MDI окно, то оно будет возвращаться, потому что оно активное и получило фокус. Чтобы найти форму ферхнего уровня, надо воспользоваться Parent до упора.

kill-still

на главной mdi форме могут быть контролы, которые могут получать фокус. (главное меню вроде контролом не является, но его открытие тоже должно отслеживаться)
Оставить комментарий
Имя или ник:
Комментарий: