[win] Можно ли узнать, куда ушёл фокус с окна?/closed
насколько я понял, WM_ACTIVATEAPP - это значит, что все твое приложение становится неактивным. Если переключение идет между двумя формами, то надо, наверно, ловить WM_ACTIVATE.
Для WM_ACTIVATE сначала приходит сообщение тому окну, где раньше был фокус, а только потом - тому, которое получает фокус, так что при первом сообщении ты еще не знаешь, кому уходит фокус.
Для WM_ACTIVATE сначала приходит сообщение тому окну, где раньше был фокус, а только потом - тому, которое получает фокус, так что при первом сообщении ты еще не знаешь, кому уходит фокус.
от в том то и проблема, что надо знать.
нашёл функцию user32.GetFocus. В принципе то, что нужно (неудобно правда хендл окна получать, а не ссылку на объект, но то фигня но есть небольшое затруднение - при смене фокуса с MDI чайлда на главную форму возвращается хэнлд чайлда, а не главного окна (если фокус уходит на соседний MDI чайлд, то всё ок). Как бороться с этим нюансом?
Есть вызовы GetForegroundWindow и GetActiveWindow
Но я настоятельно не рекомендую писать логику, которая основана на анализе клавиатурного фокуса. Хоть и бывают ситуации, когда это нужно; но они в основном связаны с реализацией своего собственного элемента управления и работают в его рамках. Анализ передачи фокуса между формами - это извращение.
Но я настоятельно не рекомендую писать логику, которая основана на анализе клавиатурного фокуса. Хоть и бывают ситуации, когда это нужно; но они в основном связаны с реализацией своего собственного элемента управления и работают в его рамках. Анализ передачи фокуса между формами - это извращение.
у GetForegroundWindow та же проблема, что и у GetFocus - оно при выделении главной миди формы возвращает её активного миди-чайлда (если таковой имеется)
а GetActiveWindow вообще всё время возвращает главную миди.
а GetActiveWindow вообще всё время возвращает главную миди.
Но я настоятельно не рекомендую писать логику, которая основана на анализе клавиатурного фокусанадо поправить поведение старого девэкспресовского грида (вер. 3.1)
У формы есть свойство ActiveMdiChild.
Я не понимаю, как можно выделить главную MDI форму, и что это вообще значит. Ясное дело, что если есть активное дочернее MDI окно, то оно будет возвращаться, потому что оно активное и получило фокус. Чтобы найти форму ферхнего уровня, надо воспользоваться Parent до упора.
Я не понимаю, как можно выделить главную MDI форму, и что это вообще значит. Ясное дело, что если есть активное дочернее MDI окно, то оно будет возвращаться, потому что оно активное и получило фокус. Чтобы найти форму ферхнего уровня, надо воспользоваться Parent до упора.
на главной mdi форме могут быть контролы, которые могут получать фокус. (главное меню вроде контролом не является, но его открытие тоже должно отслеживаться)
Оставить комментарий
kill-still
в окно приходит WM_ACTIVATEAPP. в зависимости от того, куда ушел фокус, необходимо произвести различные действия.проблема в том, что во время этого события форма, куда ушел фокус, ещё не получила WM_ACTIVATEAPP (ну или не обработала соответственно узнать, что под фокусом, таким образом невозможно. Есть ли ещё пути (ну, кроме как очередь сообщений прочитать)?