Окно поверх всех, но без фокуса...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
NightStorm
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 09.06.2008 (Пн) 18:30

Окно поверх всех, но без фокуса...

Сообщение NightStorm » 12.03.2009 (Чт) 3:17

Просмотрел 12 страниц поиска, но ничего похожего не нашёл, так что просьба в поиск не отправлять.

В общем, нужно сделать так, чтобы форма при определенных условиях появлялась поверх всех остальных окон, но при этом не забирала фокус у приложения, с которым сейчас работает пользователь. Нужно нечто вроде всплывающего сообщения, как в QIP'е, чтоб окошко тихо мирно вылезало в углу экрана, показывало то, что надо и потом убиралось.
Всё уже готово, всё работает, но вот запоролся на этом перехвате фокуса. Подскажите плиз, как от этого избавиться?

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Окно поверх всех, но без фокуса...

Сообщение BION » 12.03.2009 (Чт) 4:05

NightStorm писал(а):Просмотрел 12 страниц поиска, но ничего похожего не нашёл, так что просьба в поиск не отправлять.

В общем, нужно сделать так, чтобы форма при определенных условиях появлялась поверх всех остальных окон, но при этом не забирала фокус у приложения, с которым сейчас работает пользователь. Нужно нечто вроде всплывающего сообщения, как в QIP'е, чтоб окошко тихо мирно вылезало в углу экрана, показывало то, что надо и потом убиралось.
Всё уже готово, всё работает, но вот запоролся на этом перехвате фокуса. Подскажите плиз, как от этого избавиться?

Код: Выделить всё
' hWndInsertAfter:
Const HWND_TOPMOST = &HFFFFFFFF

' wFlags:
SWP_NOSIZE         = &H0001
SWP_NOMOVE         = &H0002
SWP_NOZORDER       = &H0004
SWP_NOREDRAW       = &H0008
SWP_NOACTIVATE     = &H0010
SWP_FRAMECHANGED   = &H0020
SWP_SHOWWINDOW     = &H0040
SWP_HIDEWINDOW     = &H0080
SWP_NOCOPYBITS     = &H0100
SWP_NOOWNERZORDER  = &H0200
SWP_NOSENDCHANGING = &H0400
SWP_DRAWFRAME      = SWP_FRAMECHANGED
SWP_NOREPOSITION   = SWP_NOOWNERZORDER
SWP_DEFERERASE     = &H2000
SWP_ASYNCWINDOWPOS = &H4000

Declare Function SetWindowPos Lib "USER32.DLL" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
                                                ByVal x As Long, ByVal Y As Long, ByVal cx As Long, _
                                                ByVal cy As Long, ByVal wFlags As Long _
                                                ) As Long
Буээ!

NightStorm
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 09.06.2008 (Пн) 18:30

Re: Окно поверх всех, но без фокуса...

Сообщение NightStorm » 12.03.2009 (Чт) 4:24

Спасибо, но это я видел, только не совсем понял, чего туда писать... а поподробнее можно? Как правильно Flags "скучковать", чтоб получилось то, что нужно?
Использование SWP_NOACTIVATE не помогает, прога всё равно фокус хватает.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Re: Окно поверх всех, но без фокуса...

Сообщение BION » 12.03.2009 (Чт) 4:57

NightStorm писал(а):Спасибо, но это я видел, только не совсем понял, чего туда писать... а поподробнее можно? Как правильно Flags "скучковать", чтоб получилось то, что нужно?
Использование SWP_NOACTIVATE не помогает, прога всё равно фокус хватает.


Если вы имеете ввиду хватание фокуса при появлении окна, то думаю так:
перед вызовом SetWindowPos, отлавливаем текущее рабочее окно
Код: Выделить всё
Declare Function GetForegroundWindow Lib "user32" () As Long

затем после показа нашего окошка и HWND_TOPMOST'а возвращаем активность прежнему рабочему окну
Код: Выделить всё
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Буээ!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно поверх всех, но без фокуса...

Сообщение Хакер » 12.03.2009 (Чт) 9:25

Это кажется совсем плохим. Кажется, чтобы добавиться нужного результата, надо окно создавать с WS_POPUP.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NightStorm
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 09.06.2008 (Пн) 18:30

Re: Окно поверх всех, но без фокуса...

Сообщение NightStorm » 12.03.2009 (Чт) 12:41

BION писал(а):Если вы имеете ввиду хватание фокуса при появлении окна, то думаю так:
перед вызовом SetWindowPos, отлавливаем текущее рабочее окно
Код: Выделить всё
Declare Function GetForegroundWindow Lib "user32" () As Long

затем после показа нашего окошка и HWND_TOPMOST'а возвращаем активность прежнему рабочему окну
Код: Выделить всё
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long


Вот за это спасибо, помогло :)

Хакер писал(а):Это кажется совсем плохим. Кажется, чтобы добавиться нужного результата, надо окно создавать с WS_POPUP.

Или я чё-то не понял, или это не то, ну в общем не работает как надо...

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Окно поверх всех, но без фокуса...

Сообщение GDK » 12.03.2009 (Чт) 12:53

WS_POPUP это, кажись, стиль окна. Тока наверно не создавать, а присваивать после загрузки и затем отображать. Да?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно поверх всех, но без фокуса...

Сообщение Хакер » 12.03.2009 (Чт) 13:17

NightStorm, у меня даже без WS_POPUP всё работет. Как ты делаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 13

    TopList