powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как активировать окно приложения, если оно уже запущено.
6 сообщений из 6, страница 1 из 1
Как активировать окно приложения, если оно уже запущено.
    #38189552
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример: Outlook Express.
Если не запущен, то запускается.
Если уже запущен, то его окно просто активируется, т.е.
1) Если свернуто, то показывается в том виде как было (normal либо max)
2) Фокус устанавливается на него.

Чтоб исключить дубликаты:
Код: vbnet
1.
2.
3.
4.
5.
6.
Sub Main()
  If App.PrevInstance Then
     Exit Sub
  End If
...
End Sub


Хорошо, это работает.

А вот с восстановлением окна, если запущено.
Ну, в духе
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub Main()
  If App.PrevInstance Then
    Dim hwndTarget As Long 'hwnd окна PrevInstance
    hwndTarget = FindWindow(vbNullString, WINDOWTITLE_APP)
    If hwndTarget <> 0 Then
      SetWindowPos hwndTarget, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 'непотопляемое окно
      SetWindowPos hwndTarget, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 'разрешаем потопить, но оно уже наверху
    End If
    Exit Sub
  End If
...
  Form1.Show
End Sub


Но этот код не совсем для этого, т.е.
1) если окно прикрыто другими, то оно наверх вылазит
НО
2) если на панели задач - там и остается
3) будучи запущенным щелчком по ярлыку, фокус в окно предыдущего экземпляра приложения не передается, а возвращается как это сказать, в папку откуда щелкнули.

Как бы этот код подправить по простому?
Есть конечно вариант послать WM_COPYDATA "предыдущему" окну, и выполнить ТАМ код

Код: vbnet
1.
2.
3.
4.
  Me.WindowState = FormWindowStateConstants.vbNormal
  Me.Visible = True
  SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 'непотопляемое окно
  SetWindowPos Me.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 'разрешаем потопить, но оно уже наверху


Но без этого никак нельзя?
...
Рейтинг: 0 / 0
Как активировать окно приложения, если оно уже запущено.
    #38189872
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну чтоб восстановить с панели задач + поверх

Код: vbnet
1.
2.
3.
      ShowWindow hwndTarget, SW_RESTORE
      SetWindowPos hwndTarget, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE  'непотопляемое окно
      SetWindowPos hwndTarget, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE 'разрешаем потопить, но оно уже наверху


Но установить фокус на hwndTarget при этом не получается.
...
Рейтинг: 0 / 0
Как активировать окно приложения, если оно уже запущено.
    #38189927
Дмит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SetFocus ?
...
Рейтинг: 0 / 0
Как активировать окно приложения, если оно уже запущено.
    #38189953
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДмитSetFocus ?
Не-а, пробовал.
Помогло только вот это, причем SetWindowPos можно убрать:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 If App.PrevInstance Then
    Dim hwndTarget As Long 'hwnd окна PrevInstance
    hwndTarget = FindWindow(vbNullString, WINDOWTITLE_APP)
    If hwndTarget <> 0 Then
      ShowWindow hwndTarget, SW_RESTORE
      SetForegroundWindow hwndTarget
    End If
    Exit Sub
  End If
...
  Form1.Show
End Sub


На XP и Vista проверил, вроде все тип-топ.
SetForegroundWindow смущает, где-то я уже что-то подобное пробовал, какие-то глюки были, уж не на 7-ке ли. Не подвела бы.
...
Рейтинг: 0 / 0
Как активировать окно приложения, если оно уже запущено.
    #38189975
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все же одна вещь мне не нравится.
Если окно MAX и не свернуто на панель задач, то
SW_RESTORE
его делает Normal (не на полный экран)
что не соответствует сравнению с Outlook Express.
Т.е. по-хорошему как-то надо сделать проверку
Is "свернуто на панели задач" or NOT
Интересно как?
...
Рейтинг: 0 / 0
Как активировать окно приложения, если оно уже запущено.
    #38189998
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function IsIconic Lib "user32.dll" (ByVal hwnd As Long) As Long

If App.PrevInstance Then
    Dim hwndTarget As Long 'hwnd окна PrevInstance
    hwndTarget = FindWindow(vbNullString, WINDOWTITLE_APP)
    If hwndTarget <> 0 Then
      If IsIconic(hwndTarget) Then ShowWindow hwndTarget, SW_RESTORE
      SetForegroundWindow hwndTarget
    End If
    Exit Sub
  End If
...
  Form1.Show
End Sub
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как активировать окно приложения, если оно уже запущено.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]