App.PrevInstance

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

App.PrevInstance

Сообщение Чудик » 14.02.2005 (Пн) 18:54

Код: Выделить всё
Private Sub Form_Load()
    If App.PrevInstance = True Then
        Me.Visible = True
        Exit Sub
    Else:
        Me.Visible = False
    End If
End Sub

Почему при повторном запуске помимо того, что форма становиться видимой (как задумано) в диспетчере задач Windows отображается, что якобы запускается вторая копия программы? Мне нужно, чтобы всегда было запущено не более одной копии.
Век живи - век учись!
www.detal-plast.narod.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2005 (Пн) 19:21

Вместо "Exit Sub" напиши "Unload Me"
Изображение

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 14.02.2005 (Пн) 19:47

Тогда форма моргает раз и выгружается. Да, остается одно запущеное приложение, но мне надо чтоб это единственное приложение при повторном запуске становилось видимым.
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.02.2005 (Пн) 19:55

Передаешь в первый экземпляр программы команду "Активировать" (способы передачи - поиск по форуму), после чего закрываешь вторую копию программы (Unload Me).
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 14.02.2005 (Пн) 20:37

ОК, нашел.
Век живи - век учись!
www.detal-plast.narod.ru

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.02.2005 (Ср) 11:34

Использую так:
Код: Выделить всё
Private Sub ShowPrevInstance()
    Dim OldTitle As String
    Dim ll_WindowHandle As Long
    OldTitle = App.Title
    App.Title = "abcba - This App Will Be Closed"
    ll_WindowHandle = FindWindow(vbNullString, OldTitle)
    If ll_WindowHandle = 0 Then Exit Sub
    ll_WindowHandle = GetWindow(ll_WindowHandle, GW_HWNDPREV)
        Call OpenIcon(ll_WindowHandle)
        Call SetForegroundWindow(ll_WindowHandle)
    End
End Sub

Private Sub Form_Load()
If App.PrevInstance = True Then
    ShowPrevInstance
Else:
    Me.Visible = False
End If

т.е. как было сказано - передаю активное состояние первому приложению, а второе закрываю. Но почему-то первое, может и становиться активным, но видимым не становиться. Что-то не так?
Причем вместо Visible я использовал и ShowWindow(ll_WindowHandle, SW_.......) - на всякий случай, но без изменений!
Век живи - век учись!
www.detal-plast.narod.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.02.2005 (Ср) 12:10

А зачем там строчка "ll_WindowHandle = GetWindow(ll_WindowHandle, GW_HWNDPREV)"? Имхо она лишняя...
Изображение

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.02.2005 (Ср) 12:54

Убрал, но приложение не приобретает видимости при повторном запуске все-равно!
Век живи - век учись!
www.detal-plast.narod.ru

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.02.2005 (Ср) 12:59

может проще надо, у главной формы первого приложения добавляй:
Код: Выделить всё
me.Setfocus
me.windowstate=vbNormal

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.02.2005 (Ср) 13:08

Нет, не имеет смысла. Во-первых, это и реализовывается через API. Во-вторых, если написать через Ме......, то это примениться ко второму приложению, а не к первому. Здесь не будет никакого идентификационного признака окна (приложения).
Век живи - век учись!
www.detal-plast.narod.ru

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 17.02.2005 (Чт) 8:09

Такая затертая тема, неужто никто не подкинет идейку!!!!!!!!!!!!!!!!!!!!!!!!!!
Век живи - век учись!
www.detal-plast.narod.ru

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 17.02.2005 (Чт) 17:18

Через API лутше, App.PrevInstance только на один экзэшнк, а может быть копия в другой папке

А если твою старую сделать активной она нормально продолжит работу.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 18.02.2005 (Пт) 12:23

Чудик писал(а):Такая затертая тема, неужто никто не подкинет идейку!!!!!!!!!!!!!!!!!!!!!!!!!!


Может быть вместо SetForegroundWindow(ll_WindowHandle) использовать ShowWindow, с параметром WM_RESTORE? А потом уже использовать SetForegroundWindow(ll_WindowHandle) .
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Plohish
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 29.11.2023 (Ср) 18:54

Re: App.PrevInstance

Сообщение Plohish » 29.11.2023 (Ср) 19:05

Код: Выделить всё
Dim OldTitle As String
    If App.PrevInstance Then
        OldTitle$ = App.Title
        App.Title = "unwanted instance"
        AppActivate OldTitle
        SendKeys "% R ~", True
        End
    End If

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: App.PrevInstance

Сообщение серверянин » 02.12.2023 (Сб) 13:46

Если первый экземпляр свернут в панель задач, то выше сказанный способ вызывает Run-time error 5.
Кроме того, у меня на него зазвонил антивирь, которому показалось, будто вирус перехватил управление клавиатурой.

Я эту задачу решаю обыкновенно так:
Код: Выделить всё
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long



Private Sub Form_Load()
    Me.Tag = Me.Caption
    If App.PrevInstance = True Then
        Me.Caption = Me.Tag + "###"   'смена заголовка, чтобы не был как у предыдущего окна
        'нахождение и показ предыдущего окна по его заголовку
        i = FindWindow(vbNullString, Me.Tag)
        Call ShowWindow(i, 9): Call SetForegroundWindow(i)
        End    'закрытие второго экземпляра
    End If

' (место для дальнейших команд)
'       .......
   
End Sub


(Жаль, что ответил так поздно :? )


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

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

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

    TopList