Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поймать окна ишака только что открытого мной, Ишак порождает неуловимые окна 
V
    Опции темы
null56
Дата 21.5.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Всем привет
Задача:
Просмотреть все окна, принадлежащие ТОЛЬКО ЧТО открытому мной, с помощью 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?

Спасибо

ЗЫ: способ искать все окна в системе по идентификатору исключаю, хочется более быстрого решения
PM MAIL   Вверх
xvr
Дата 22.5.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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

PM MAIL   Вверх
null56
Дата 22.5.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Жаль, спасибо большое

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

Добавлено через 5 минут и 16 секунд
думаю, это будет быстрее, чем просматривать все окна в системе
PM MAIL   Вверх
null56
Дата 27.5.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



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

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

PM MAIL   Вверх
xvr
Дата 27.5.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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


PM MAIL   Вверх
null56
Дата 27.5.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



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

Так что думаешь в других версиях ишака надеяться на то, что этим способом я сохраню себе идентификатор процесса после CreateProcess не стоит?
PM MAIL   Вверх
xvr
Дата 27.5.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

Цитата

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

PM MAIL   Вверх
null56
Дата 27.5.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



низя (
да, скорее всего надеятся на "фичу" не стоит...
а можно ли зная HWND окна проверить существует ли оно действительно в системе?
PM MAIL   Вверх
null56
Дата 27.5.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



скорее всего postMessage вернет FALSE, ладно, буду пробовать
xvr, спасибо тебе за помощь
PM MAIL   Вверх
GremlinProg
Дата 28.5.2010, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

Код

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



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
null56
Дата 28.5.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



пасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1175 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.