Активация окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Активация окна

Сообщение Space » 28.01.2009 (Ср) 22:53

Не понимаю, почему при показе главного окна после старта проги оно получает ABM_ACTIVATE, ведь оно просто показывается, а фокус остаётся у другого приложения. У меня свой заголовок окна и когда моё приложение стартует на автостарте, окно показывается активным из-за ABM_ACTIVATE, хотя оно не активно, а активно окно другого приложения...

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 29.01.2009 (Чт) 2:10

ау, есть кто живой?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Активация окна

Сообщение MIT » 29.01.2009 (Чт) 2:30

Есть! Я живее всех живых. Но я не вижу основного вопроса. Ты хочешь понять почему или что?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 29.01.2009 (Чт) 2:49

Я уже подключил сюда GetForegroundWindow, но опять трабл - если активен, например, блокнот, то при показе моего приложения frmMain.Show оно отображается правильно - как неактивное. При щелчке на моём frmMain ABM_ACTIVATE не приходит! А при щелчке опять на блокноте, потом на frmMain ABM_ACTIVATE приходит и всё продолжает работать правильно. Глючит только при первом переключении окон. Почему?
Код: Выделить всё
   Select Case uMsg
'***************
    Case ABM_ACTIVATE
'Debug.Print "ABM_ACTIVATE", wParam, lParam
        If wParam Then
'окно активируется
'сообщение ABM_ACTIVATE приходит всегда при показе окна, но окно может не иметь фокус ввода, поэтому ещё проверим через GetForegroundWindow
          If frmMain.hwnd = GetForegroundWindow Then LoadBorderActive True
        Else
'окно деактивируется, если frmMain.Visible=False - окно прячется и менять бордюр нет смысла
            If frmMain.Visible Then LoadBorderActive False
        End If
End Select

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 29.01.2009 (Чт) 20:42

Живее живых, ты там жив? :)
Вообщем, получается так: При показе окна оно получает ABM_ACTIVATE, хотя активно другое окно, потом при клике на нашем окне система считает, что наше окно активно, т.к. получило уже ABM_ACTIVATE и не шлёт ABM_ACTIVATE, а шлёт его после отсылки сообщения о деактивации окна. Т.е. я так понимаю, система шлёт сообщения по очереди - активация/деактивация/активация/деактивация... и её больше ничего не волнует. Вот таки дела. Непонятно только, как это система допускает два одновременно активных окна. Как весело :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 30.01.2009 (Пт) 0:32

как весело... :) А как можно отловить любой клик на форме (т.е. типа KeyPreview, когда клик на контролах ловится ещё и формой)?

Йода
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 99
Зарегистрирован: 06.01.2008 (Вс) 21:04
Откуда: Московская область

Re: Активация окна

Сообщение Йода » 30.01.2009 (Пт) 0:54

Совершенно точно зная, что ABM_ACTIVATE - сообщение Панели задач и не имеет никакого отношения к активации/деактивации моего окна, я всё- таки попробовал отловить его. Моё удивление было безграничным, когда при активации/деактивации моего окна сообщение ABM_ACTIVATE действительно приходило! Помедитировав на результат, я в течение 5-и часов рылся в сети вообще и в MSDN в частности, пытаясь найти объяснение этому феномену. Устав от бесплодых поисков, я решил узнать, что же приходит раньше: ABM_ACTIVATE или WM_ACTIVATE, и тут выяснилось, что значение константы ABM_ACTIVATE равно значению константы WM_ACTIVATE :evil: :evil: :evil: ... И ещё: Space, я так и не понял, что же у тебя не получается.
З.Ы. Ура! У меня появилась первая звёздочка!!!
Sub or Function not defined

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 30.01.2009 (Пт) 1:05

ну как же? я же писал, при активации моего окна мне надо подсветить бордюр окна, сообщение об активации приходит некорректно. Или надо ловить другое какое-то сообщение?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Активация окна

Сообщение MIT » 30.01.2009 (Пт) 1:10

Space писал(а):Живее живых, ты там жив?
Я тут, и я жив. Только вот по основной теме как-то сказать особо и нечего: сам с таким никогда не сталкивался, в сети данных тоже не нашел (быстрым гуглингом), вот и не постил.
Space писал(а):А как можно отловить любой клик на форме (т.е. типа KeyPreview, когда клик на контролах ловится ещё и формой)?
Наверно хук тебе вполне подойдет.

Space писал(а):я же писал, при активации моего окна мне надо подсветить бордюр окна, сообщение об активации приходит некорректно. Или надо ловить другое какое-то сообщение?
Это в смысле "помигать ораньжевеньким на панели задач?" или что?

Йода писал(а):З.Ы. Ура! У меня появилась первая звёздочка!!!
Поздравляю! :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 30.01.2009 (Пт) 1:23

блин, ну вы чё, вообще все в танке? Когда окно активно, один цвет бордюра окна, неактивно - другой!

Йода
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 99
Зарегистрирован: 06.01.2008 (Вс) 21:04
Откуда: Московская область

Re: Активация окна

Сообщение Йода » 30.01.2009 (Пт) 1:30

2Space: Всё правильно, ловишь WM_ACTIVATE. Просто при создании окна рисуй бордюр подсвеченым.
2MIT: Спасибо.
З.Ы.
Space писал(а): Когда окно активно, один цвет бордюра окна, неактивно - другой!
Совершенно не обязательно: Пуск-Панель управления-Экран-Оформление-Дополнительно: Заголовок активного окна = Заголовок неактивного окна. Зачем? А я хочу чтобы окна так выглядели. И они будут так выглядеть. Потому что мне так нравится. И вообще, если какая-то программа будет мне указывать какого цвета у неё бордюр, она будет моментально снесена.

З.З.Ы. Еле нашёл :D : Градиентный заголовок окна.
Вложения
Form_Grad.rar
Пример кастомной отрисовки неклиентской области
(5.7 Кб) Скачиваний: 37
Sub or Function not defined

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 30.01.2009 (Пт) 2:09

люди!!! вникните в суть проблемы!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 30.01.2009 (Пт) 5:46

а как можно сообщить системе, что моё окно - неактивное? Т.е. что-то вроде Me.LostFocus...

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 31.01.2009 (Сб) 4:12

итак, запускаем проект, быстренько переключаемся на окно блокнота или другого приложения. Когда появится наше окно, щёлкаем на нём. Здесь мы видим, что бордюр не изменил цвет - окно вроде неактивно. Обратно щёлкаем на окне другого приложения, затем на нашем - теперь наше окно отмечается бордюром как активное. Проблема неактивации окна при первом клике на нём описана выше, необъяснена и её решение не найдено!
Вложения
ACTIVATE_Wnd.zip
(2.25 Кб) Скачиваний: 42

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 01.02.2009 (Вс) 2:47

всё, гениальные идеи кончились :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Активация окна

Сообщение Space » 04.02.2009 (Ср) 4:04

оказывается, надо делать так:
Код: Выделить всё
   Select Case uMsg
'***************
    Case WM_NCACTIVATE
        If wParam Then
Debug.Print "Active "; lParam; wParam
            SetBorderActive True
        Else
Debug.Print "DeActive "; lParam; wParam
         SetBorderActive False
        End If
...
но, тогда окно мерцает при фоновом показе, пока не нашёл, как избавиться...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

    TopList