Активация предыдущей инстанции приложения

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

Активация предыдущей инстанции приложения

Сообщение zHackLeX » 22.06.2005 (Ср) 21:56

Действительно, как стопудово передать управление на прошлый экземпляр, а старый закрыть?
Как это делает Windows Media Player 8+?
Да, у меня ещё через мэйлслот передается Command$(), для этого вообще-то вся и затея: чтобы управлять приложением,
достаточно запустить ярлык к нему с соответствующим ключом
командной строки:
Программа, запустившись, видит, что она в системе не первая,
передаёт Command$ через мэйлслот первому экземпляру, а сама
на прощанье целует себя в... :oops: короче, сворачивается,
и передает управление первому экземпляру.
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 23.06.2005 (Чт) 10:17

Активировать предыдущий экземпляр = активировать его окно. :lol:
1)Найти процесс предыдущего экземпляра приложения (юзать Process32First(), Process32Next(), CreateToolhelp32Snapshot() ...);
2)Прошукать все потоки того процесса (Thread32First(), Thread32Next());
3)Найти нужное окно в потоках ( EnumThreadWindows() );
4)Отпостить ему WM_SHOW через PostMessage();
5)Или проинформировать процесс о чём надо, например через PostThreadMesage().

Закрыть текущий процесс:
PostQuitMessage(), End() :D

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 23.06.2005 (Чт) 11:20

zHackLeX

Ну и чё? Сам себе и ответил...

Arcanoid
У-тютю,
- а если стоит галка Unattended ?
- а если ехе переименовали?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 23.06.2005 (Чт) 17:10

Sebas
а как ты переименуешь exe если он уже запущен?!

и, пардон, что значит Unattended? :oops: не слыхал..

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 23.06.2005 (Чт) 17:57

Arcanoid писал(а):Sebas
а как ты переименуешь exe если он уже запущен?!

Возьми да попробуй - в NT это запросто.

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

Сообщение tyomitch » 23.06.2005 (Чт) 21:50

Arcanoid писал(а):и, пардон, что значит Unattended? :oops: не слыхал..

Возьми да посмотри: Project -> Properties -> Unattented Execution
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 26.06.2005 (Вс) 12:38

Ага. Как просто. Было бы всё ОК, если бы я разбирался, как обработать то, что пришло с PostMessage.
2) А что, AppActivate может помочь или нет?
Я пробовал, но он что-то не катит.

Как вообще пользовать AppActivate к ОСХу?
Положим, ОСХ мой, я знаю как называется (Caption) его форма, и знаю, как называется моя (хозяйская, на которой нарисован значок ОСХа) форма. Можно ли активировать её без АРI?

ЗЫ. никто не сталкивался с этим раньше?
ЗЗЫ. А если так: активируем форму ПОЛУЧАЯ сообщение, т. е., уже в своём процессе (т. е. при обработке сообщения первым экземпляром),
можно Appactivate? Я делал, но не катит :( Может что не так?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.06.2005 (Вс) 18:24

Мне кажеться, проще делать так:
1. Первое приложение создает скрытое окно с особым классом и заголовком.
2. Новый инстанс находит это окно(FindWindow), и посылает ему сообщение WM_ACTIVATE. Или, если тебя это не устраивает, посылай ему пользовательское сообщение(WM_USER+X)(и в параметрах передавай все, что еще нужно(скажем имена файлов и т.п.)

Ну а что бы активировать свою форму достаточно использовать Form.SetFocus
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 26.06.2005 (Вс) 20:22

ANDLL писал(а):посылай ему пользовательское сообщение(WM_USER+X)(и в параметрах передавай все, что еще нужно(скажем имена файлов и т.п.)

Гы-гы-гы :lol:

Если на все имена файлов ему хватит 8 байт - тогда сработает ;-)
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 28.06.2005 (Вт) 12:40

tyomitch писал(а):Если на все имена файлов ему хватит 8 байт - тогда сработает ;-)

Ско-о-о-ка?? :shock: Да у меня через параметр командной строки передаются такие макро-команды, что и 256-то мало!!!

Ну это-то ладно. Но почему SetFocus-то не пашет?! :twisted:
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 28.06.2005 (Вт) 22:25

Ennor писал(а):
Arcanoid писал(а):Sebas
а как ты переименуешь exe если он уже запущен?!

Возьми да попробуй - в NT это запросто.

Ну, если нравится самому себе рыть яму, то что ж тут поделаешь... :roll:

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.06.2005 (Чт) 7:32

tyomitch писал(а):
ANDLL писал(а):посылай ему пользовательское сообщение(WM_USER+X)(и в параметрах передавай все, что еще нужно(скажем имена файлов и т.п.)

Гы-гы-гы :lol:

Если на все имена файлов ему хватит 8 байт - тогда сработает ;-)


А почему именно восемь байт? Тебе напомнить про API-функцию GlobalAlloc?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение alibek » 30.06.2005 (Чт) 11:40

ANDLL писал(а):А почему именно восемь байт? Тебе напомнить про API-функцию GlobalAlloc?

А зачем эти шаманские танцы, если есть пайпы и майлслоты?
Lasciate ogni speranza, voi ch'entrate.

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 30.06.2005 (Чт) 20:53

Ладно, а с SetFocus ещё пошаманю.
А то что-то не то...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2005 (Пт) 4:24

ANDLL писал(а):А почему именно восемь байт? Тебе напомнить про API-функцию GlobalAlloc?

А тебе напомнить, что на 32-разрядных виндах действие функции GlobalAlloc аналогично действию функции LocalAlloc?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.07.2005 (Пт) 7:59

Вот блин... В моей книжке по C++ есть пример передачи данных с использованием GMEM_SHARE. А в MSDN написано, что этот флаг не работает. Вот и верь после этого книжкам.
И что же в Windows не существует глобальных областей адресного прстранства?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 01.07.2005 (Пт) 8:59

ANDLL писал(а):
А почему именно восемь байт? Тебе напомнить про API-функцию GlobalAlloc?

А зачем эти шаманские танцы, если есть пайпы и майлслоты?


А еще можно передать StrPtr.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.07.2005 (Пт) 9:34

Именно этого делать и нельзя... Именно это и вызвало смех у Темыча.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2005 (Пт) 10:21

ANDLL писал(а):И что же в Windows не существует глобальных областей адресного прстранства?

А ты позырь в Кирпичах, как Тёмыч сделал маршалер.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Worobjoff
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 19.02.2005 (Сб) 17:51

Сообщение Worobjoff » 02.07.2005 (Сб) 12:19

Когда я еще учился VB6, где-то в начале книги был такой пример кода.
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
               
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _
                    ByVal NcmdShow As Long) As Long

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Private Const SW_RESTORE = 9

Private Sub Form_Load()
   Dim sTitle As String
   Dim hwnd_ As Long
   Dim lRetVal As Long
   If App.PrevInstance Then
      sTitle = Me.Caption
      App.Title = "Новая копия"
      Me.Caption = " Новая копия"
      hwnd_ = FindWindow(vbNullString, sTitle)
      If hwnd_ <> 0 Then
          lRetVal = ShowWindow(hwnd_, SW_RESTORE)
          lRetVal = SetForegroundWindow(hwnd_)
      End If
      Unload Me
      End
   End If
End Sub
Здесь не передается Command, но по-моему, этот пример можно взять за основу и доработать.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.07.2005 (Сб) 12:48

Этот пример лучше не брать за основу и дорабатывать. Потому что он довольно громоздко замещает стандартную функцию AppActivate...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mizin Alex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 12.06.2004 (Сб) 9:46
Откуда: Россия , Ивдель

Сообщение Mizin Alex » 02.07.2005 (Сб) 13:00

Как вариант:
Public Function RestorePrevInstance(strCaption As String) As Boolean
Dim iCount As Integer
Dim i As Long
Dim pos As Integer
Dim lngEnum As Long
Dim udtCurrWin As WINDOWPLACEMENT
Dim lngLenArray As Long

ReDim strCaptions(0)
ReDim lngHandle(0)


lngEnum = EnumWindows(AddressOf Callback1_EnumWindows, 0)

iCount = 0

lngLenArray = UBound(strCaptions)

For i = 0 To lngLenArray

pos = InStr(1, strCaptions(i), strCaption, vbTextCompare)

If pos > 0 Then
udtCurrWin.Length = Len(udtCurrWin)
Call GetWindowPlacement(lngHandle(i), udtCurrWin)

If udtCurrWin.showCmd = SW_SHOWMINIMIZED Then
udtCurrWin.Length = Len(udtCurrWin)
udtCurrWin.Flags = 0&
udtCurrWin.showCmd = SW_SHOWNORMAL
Call SetWindowPlacement(lngHandle(i), udtCurrWin)
End If

Call SendMessage( lngHandle(i), &H112, SC_RESTORE, 0)
iCount = iCount + 1
End If
Next

If iCount >= 1 Then
RestorePrevInstance = True
Else
RestorePrevInstance = False
End If

End Function

Public Function Callback1_EnumWindows(ByVal hWnd As Long, ByVal lpData As Long) As Long
Dim cnt As Long
Dim strTitle As String * 256

cnt = GetWindowText(hWnd, strTitle, 255)

If cnt > 0 Then
ReDim Preserve lngHandle(UBound(strCaptions) + 1)
ReDim Preserve strCaptions(UBound(strCaptions) + 1)
strCaptions(UBound(strCaptions)) = Left$(strTitle, cnt)
lngHandle(UBound(lngHandle)) = hWnd
End If

Callback1_EnumWindows = 1
End Function

С ув.Alex

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

Сообщение tyomitch » 02.07.2005 (Сб) 13:26

Mizin, твой пример, как и предыдущий, не передаёт параметры.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.07.2005 (Сб) 17:48

2tyomitch:А чем плох тогда твой маршалер? Чего ты смеялся то?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 02.07.2005 (Сб) 20:05

Мой маршалер ничем не плох :-)

Смеялся я потому, что возни с маршалингом выходит намного больше, чем при использовании некривых способов решения данной задачи - таких, как пайпы.
Изображение


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 118

    TopList  
cron