Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Поймать окна ишака только что открытого мной


Автор: null56 21.5.2010, 19:41
Всем привет
Задача:
Просмотреть все окна, принадлежащие ТОЛЬКО ЧТО открытому мной, с помощью CreateProcess, приложению Internet Explorer.
Как бы страшно не звучало, на коде думаю будет проще
Код

std :: vector <HWND> g_MyHandleList;
// просмотр заголовков второго уровня
BOOL CALLBACK EnumChild(HWND hwnd, LPARAM lparam)
{
    wchar_t buff[255] = L"";
    int num = GetWindowText(hwnd, buff, 255);
    MessageBox(0, buff, __TEXT("EnumChild"), MB_OK);
    return TRUE;
}

// просмотр заголовков окон первого уровня
BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
{
    wchar_t buff[255] = L"";
    int num = GetWindowText(hwnd, buff, 255);
    g_MyHandleList.push_back(hwnd);
    MessageBox(0, buff, __TEXT("EnumThreadWndProc"), MB_OK);
    return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    PROCESS_INFORMATION pi;
    // CreateProcess
    EnumThreadWindows(pi.dwProcessId (или threadId), EnumThreadWndProc, 0);
    int num = g_MyHandleList.size();
    for (int i = 0; i < num; i++)
    {
        EnumChildWindows(g_MyHandleList[i], EnumChild, 0);
    }
    return 1;
}


Проще говоря, нужно запустить ишака и прочитать заголовки его окон первого и второго уровня... 
ПРОБЛЕМА НЕ В ПРОГРАММЕ!!!! Код я привел для того, чтобы было проще понять, чего хочу, проблема в самом ишаке...

Проблема: код моей программы отработает только в том случае, если в системе еще не запущены приложения internet explorer (8 версия, вроде). Если в системе ранее уже запущен ишак, то мне после CreateProcess в processId и threadId уже вернется непонятно что, значения, но эти значения не актуальны для моей задачи, идентификатора процесса такого я не вижу в диспетчере задач, но самое печальное, что EnumThreadWindows уже не отрабатывает.

Я не буду спрашивать, что не так в моем коде, а хочу узнать, есть ли возможность поймать окно Internet Explorer запущенное непосредственно мной после вызова функции CreateProcess?

Спасибо

ЗЫ: способ искать все окна в системе по идентификатору исключаю, хочется более быстрого решения

Автор: xvr 22.5.2010, 12:00
Цитата(null56 @  21.5.2010,  19:41 Найти цитируемый пост)
Если в системе ранее уже запущен ишак, то мне после CreateProcess в processId и threadId уже вернется непонятно что, значения, но эти значения не актуальны
Угу. На самом деле в этом случае новая копия IE не запускается, а запрошенный URL открывается в уже запущенной копии.
Реализуется это очень просто - при старте IE проверяет, что он уже запущен, и если да - до устанавливает соединение с уже запущенной копией и передает ей URL для открытия, после чего сам завершается. Т.ч. ProcessID, который возвращает CreateProcess соотвествует процессу, который практически немедленно завершается.
Цитата

есть ли возможность поймать окно Internet Explorer запущенное непосредственно мной после вызова функции CreateProcess?
Увы, нет у него окна, и вообще ничего нет - завершается он немедленно  smile 

Автор: null56 22.5.2010, 14:27
Жаль, спасибо большое

Добавлено через 2 минуты и 14 секунд
Хотя можно попробовать в таком случае найти среди процессов ишак, извлечь идентификатор и пробежаться по его окнам, может прокатит

Добавлено через 5 минут и 16 секунд
думаю, это будет быстрее, чем просматривать все окна в системе

Автор: null56 27.5.2010, 14:35
xvr
Интересный факт я нашел....
Если порождать процессы ишака в невидимом режиме (wShowWindow = SW_HIDE;), то тогда ишак порождает "реально новые" процессы при чем постоянно новые, то есть значения ProcessId актуален, так же как и хендл

Как думаешь это надежный факт запуска с сохранением идентификатора процесса или это версионная привязка?

Автор: xvr 27.5.2010, 15:15
Цитата(null56 @  27.5.2010,  14:35 Найти цитируемый пост)
Как думаешь это надежный факт запуска с сохранением идентификатора процесса или это версионная привязка?
Версионная. Тем более зачем нужен ID процесса (для поиска окон), если все его окна HIDE?  smile 


Автор: null56 27.5.2010, 15:26
Мне как раз скрытый нужен. Зачем мне отображать окна, если могу ему отправить сообщения на обновление и закрытие.
Задача вообще такая: запусить ишака (желательно в скрытом режиме), найти окно по заголовку, который мне известен, так как я скармливаю при запуске ишаку файл. Далее ищу окно и периодически его обновляю, в конце его закрываю

Так что думаешь в других версиях ишака надеяться на то, что этим способом я сохраню себе идентификатор процесса после CreateProcess не стоит?

Автор: xvr 27.5.2010, 16:09
Цитата(null56 @  27.5.2010,  15:26 Найти цитируемый пост)
Так что думаешь в других версиях ишака надеяться на то, что этим способом я сохраню себе идентификатор процесса после CreateProcess не стоит? 
Не стоит. Его текущее поведение больше похоже на баг, чем на фичу  smile 

Цитата

Задача вообще такая: запусить ишака (желательно в скрытом режиме), найти окно по заголовку, который мне известен, так как я скармливаю при запуске ишаку файл. Далее ищу окно и периодически его обновляю, в конце его закрываю
А может просто встроить его к себе (в виде ActiveX контрола), и не мучится?

Автор: null56 27.5.2010, 16:42
низя (
да, скорее всего надеятся на "фичу" не стоит...
а можно ли зная HWND окна проверить существует ли оно действительно в системе?

Автор: null56 27.5.2010, 17:21
скорее всего postMessage вернет FALSE, ладно, буду пробовать
xvr, спасибо тебе за помощь

Автор: GremlinProg 28.5.2010, 08:04
Цитата(null56 @  27.5.2010,  18:42 Найти цитируемый пост)
а можно ли зная HWND окна проверить существует ли оно действительно в системе?

Код

if( ::IsWindow( hwnd ) ){
  //  существует
}else{
  //  нет
}

Автор: null56 28.5.2010, 20:49
пасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)