Найти окно программы, запущенной из моей

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

Найти окно программы, запущенной из моей

Сообщение kirrun » 11.04.2006 (Вт) 19:46

Господа, подскажите пожалуйста.

Дано:
Моя программа shell'ом запускает некий bat-ник.
Известно, что этот батник сам не закроется.
Заголовок окна не известен (точнее, он, конечно известен - "C:\WIndows\cmd.exe", но нет гарантии, что он будет один.)

Найти:
Собственно это самое окно cmd.exe которое получается.

Проблема в том, что известно только то, что cmd.exe запускается из моей программы, так что я понимаю тут нужна какая-то апи, но не FindWindow.
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 11.04.2006 (Вт) 20:32

гм.. задача немного изменилась...

Необходимо чуть больше "власти" над окном.

Тербуется:

Уметь прятать\показывать его
Уметь закрываться вместе с ним
Уметь закрывать его (корректно т.е. как Ctrl+C)
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.04.2006 (Вт) 21:13

CreateProcess?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение ANDLL » 11.04.2006 (Вт) 21:50

Shell возвращает pID кажеться, так что искать все его окна.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 11.04.2006 (Вт) 22:55

сори ступил. Думаю дальше =)
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 11.04.2006 (Вт) 23:39

гм...

Код: Выделить всё
' Form
' <...>
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = SW_NORMAL
    'Set the priority class
    pclass = HIGH_PRIORITY_CLASS
    'Start the program
   
    CreateProcess vbNullString, App.Path & "\123.bat", sec1, sec2, False, pclass, 0&, vbNullString, sinfo, pinfo
    EnumThreadWindows pinfo.dwThreadId, AddressOf EnumThreadWndProc, 0

'<...>

'Module
Declare Function EnumThreadWindows Lib "user32" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long

Public a As Long

Public Function EnumThreadWndProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
    MsgBox hWnd
    h = hWnd
    EnumThreadWndProc = 1
End Function


Почему-то не работает... Как-будто у thread'а нету окон... Где ошибка?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

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

Сообщение Sebas » 12.04.2006 (Ср) 8:46

пожет оно просто неуспело создаться?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

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

Сообщение GSerg » 12.04.2006 (Ср) 8:52

С одной стороны,
Before trying to communicate with the child process, the parent process can use WaitForInputIdle to determine when the child's initialization has been completed. For example, the parent process should use WaitForInputIdle before trying to find a window associated with the child process.


Но с другой стороны,
If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately.
...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 12.04.2006 (Ср) 14:34

пробовал и по 1-секундому таймеру. Нифига.

Буду думать с Shell'ом...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 12.04.2006 (Ср) 15:44

так... Пока напишу для обычного процесса.. С консолью потом буду разбираться..

Имеется:
Спрятать окно
Показать окно
Закрыть при выгрузке форму (PostMessage WM_CLOSE)

Нужно:
Закрыться при завершении того процесса.

Собсно, внимание, вопрос: как отловить то самое завершение процесса (вроде видел где-то функцию, но не могу найти)?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

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

Сообщение GSerg » 12.04.2006 (Ср) 15:47

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

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 12.04.2006 (Ср) 16:09

GSerg писал(а):В Кирпичи.


Решпект.

Так.. щас я убегаю. ПРиду вечерком буду думтаь над консолью. Ни у кого идей не появилось?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 13.04.2006 (Чт) 21:50

так.. а вот и встреченная проблема...

вот нарезки кода:

Код: Выделить всё
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = SW_NORMAL
    'Set the priority class
    pclass = HIGH_PRIORITY_CLASS
   
    'Start the program
    CreateProcess "C:\p.exe", vbNullString, sec1, sec2, False, pclass, 0&, vbNullString, sinfo, pinfo
    WaitForInputIdle pinfo.hProcess, INFINITE
    EnumThreadWindows pinfo.dwThreadId, AddressOf EnumThreadWndProc, 0
   
    wtr.Wait pinfo.hProcess

Код: Выделить всё
Public wnd() As Long

Public Function EnumThreadWndProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Static col As Integer
    If IsEmpty(col) Then col = 0
    ReDim Preserve wnd(col)
    wnd(col) = hwnd
    col = col + 1
   
    EnumThreadWndProc = 1
End Function


Проблема в том, что если таким образом запустить скомпиленную прогу вида
Код: Выделить всё
Private Sub Form_Load()
Form2.Show
End Sub

То преечисляется туева куча окон (если быть точным - 5).
При этом если сделать For each...блаблабла...ShowWindow... то, на панели задач помимо двух нормлаьных окон появляется еще одно без заголовка, неравзорачиваемое и т.п.

Так. Тепреь что я думаю по этому поводу. Видимо, перечисляя окна нужно записывать только окна определенного класса. Но этих классов же сотни! Как отделить мух от котлет - т.е. нормальные окна от всяких системных...?

added: блин, чувствую себя полным идиотом... тепреь waiter даже на обычный хэндл не встает... С утра работал ведь!!!
Пойду перезагружусь... :?

added&edited: перезагрузка помогла. Пока копм ребутился я выпил вишневого сока, понял что я идиот и исправил тупейшую ошибку.
Остается проблема с отсутствующим окном.
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)


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

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

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

    TopList