Как поймать событие потери фокуса формой?

Автор lavgirb, 24.12.25, 17:28:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

lavgirb

Загружаю форму VB6. Тыкаю мышкой в экран мимо нее, на окно другого приложения. Форма становится неактивной.
Form_LostFocus не ловит это событие.
Другими словами, как узнать, что стало активным любое другое приложение, а не мое?
Может быть есть относительно простые способы?

p3452

Ну, если радикально, то перехватываем клик и смотрим, что под курсором...

А форма главная, или дочерняя?

lavgirb

Цитата: p3452 от 24.12.25, 17:32:33А форма главная, или дочерняя?
Форма главная. Она должна понять, что с нее ушел фокус. И запустить таймер на время простоя.

Цитата: p3452 от 24.12.25, 17:32:33Ну, если радикально, то перехватываем клик и смотрим, что под курсором...
Ага, а с помощью WinAPI можно сделать? Или как?
Тогда зная координаты клика можно было бы понять, за пределами формы клик или нет.

p3452

А события Deactivate у формы нет?

p/s: Deactivate — событие класса Form (в C#), пространство имён — System.Windows.Forms. Происходит при потере фокуса формой, когда она становится неактивной.

lavgirb

Цитата: p3452 от 24.12.25, 17:54:25А события Deactivate у формы нет?
В том то и дело, что нет.
Есть Form_LostFocus, но что-то не поучается с его помощью. Не реагирует.
Может, еще попробую...

p3452

- Странно, учитывая то что родная Справка от Мелкомягких (по WindowsForm) идет для двух языков сразу - C# и VB...

p/s: По WinAPI можно глянуть здесь: Win 32 API по шагам
 

Student2025

#6
Написал ИИ - напиши 10 примеров с разным подходом реализации задачи о отлове потери фокуса с главного окна. И много вариантов он там вывел но все надо тестить.

https://chat.qwen.ai/s/ee860d5b-db57-4508-8bb1-89220f2b2b3c?fev=0.1.27

Потратил все токены  :o  Моя щедрость не знает границ  :)  lavgirb с вас пиво! (шутка)

p3452

Упс, у Вас VB6...

Вот конкретный пример (и описание) на двух языках, но для .NET: mouse_event (user32)
+ Благодарностей: 1

lavgirb

Цитата: p3452 от 24.12.25, 21:43:38Упс, у Вас VB6...

Вот конкретный пример (и описание) на двух языках, но для .NET: mouse_event (user32)
Спасибо. Думаю в выходные посмотреть.

Student2025

Цитата: p3452 от 24.12.25, 21:43:38Вот конкретный пример (и описание) на двух языках, но для .NET: mouse_event (user32)

А если форма не активна а указатель мыши находится поверх нее что тогда ?

Цитата: lavgirb от 25.12.25, 07:27:21Спасибо. Думаю в выходные посмотреть.

Он сунул Вам палку в колеса а Вы этому рады.

p3452

Student2025, ну чтобы Вы делали (со своим аварийным кодом) если бы не увидели ЗДЕСЬ ссылочку :o:
(Неугомонный форумный ...)

lavgirb

p3452, оказалось довольно просто с помощью таймера и функции WinAPI GetForegroundWindow
Благодарю Вас за обсуждение!

Student2025

Цитата: p3452 от 26.12.25, 10:09:07Student2025, ну чтобы Вы делали (со своим аварийным кодом) если бы не увидели ЗДЕСЬ ссылочку :o:

О как быстро Вы приписали статус "аварийный" код к "не апробированному"..
С ходу могу написать 5 опечаток на сайте pinvoke.

В 2003г. была написана одна программа по WinAPI, но сейчас ее сайт канул в небытие. Нашел способ динамически извлекать доступные WinAPI функции не только "штатные".

Цитата: p3452 от 26.12.25, 10:09:07(Неугомонный форумный ...)
Агрессивный  перфекционизм - попытка балансировать и только..

Цитата: lavgirb от 27.12.25, 20:26:53p3452, оказалось довольно просто с помощью таймера и функции WinAPI GetForegroundWindow
Благодарю Вас за обсуждение!

Не надо городить огород.. VB6 предлагает менее ресурсоёмкие варианты.

Student2025

lavgirb, говорю Вам как жующему горький хлеб - есть инструменты энергоэффективности кода.
Я на форумах много лет и вижу тенденцию что люди тянутся к "шустрым" приложениям.

p3452

Цитата: lavgirb от 27.12.25, 20:26:53p3452, оказалось довольно просто с помощью таймера и функции WinAPI GetForegroundWindow
Благодарю Вас за обсуждение!
- Получилось и хорошо!..

p/s:
Не помешало бы:
- проверить на нескольких, частично перекрывающихся, окнах;
- попробовать вариант с GetFocus().