Появилась необходимость после создания окна Internet Explorer через вызов ShellExecuteEx находить окно, которое было создано. ShellExecuteEx возвращает HPROCESS. Я пытался перебирать все активные окна и из них получать ссылку на их процесс. После этого сравнивал или ссылка на процесс не такая же как у меня после создания IE. Проблема в том, что условие никогда не выполняется, т.е. ни один из процессов не совпадает с возвращенным из ShellExecuteEx. При этом окно с IE, которое я создал, проходит через цикл. Просто там значение HPROCESS другой. В чем может быть проблема?
Код который я использую:
CString strAddress = _T("iexplore");
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = _T("open");
ShExecInfo.lpFile = strAddress;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShExecInfo.hProcess = NULL;
bool bResult = ShellExecuteEx(&ShExecInfo);
WaitForInputIdle(ShExecInfo.hProcess, 2000);
HWND hWmd = GetConsoleHwnd();
HWND h = ::GetTopWindow(0 );
while ( h )
{
DWORD pid;
DWORD dwTheardId = ::GetWindowThreadProcessId( h,&pid);
HANDLE hProc = ::OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid);
if ( hProc == ShExecInfo.hProcess )
{
// here = h that you looking forbreak;
}
h = ::GetNextWindow( h , GW_HWNDNEXT);
}
Здравствуйте, Аноним, Вы писали:
А>Потому что pid'ы надо сравнивать, а не хендлы, которые совпадать совершенно не оябязаны.
Вторая проблема более серьёзна: если IE уже запущен, он просто пнёт существующий экземпляр, и окно будет создано от имени другого процесса.
Более-менее работающий способ -- при вызове IE подсунуть ему html с предопределённым title (лучше всего GUID) и искать окно по заголовку. Но и то тут могут быть проблемы, зависящие от настроек.
Правильный подход -- создавать браузер через automation. Вот, поройтесь вокруг: InternetExplorer Object
Re[3]: Проблема при получении HWND из HPROCESS
От:
Аноним
Дата:
07.02.11 14:04
Оценка:
Здравствуйте, quodum, Вы писали:
Q>Вторая проблема более серьёзна: если IE уже запущен, он просто пнёт существующий экземпляр, и окно будет создано от имени другого процесса.
Q>Более-менее работающий способ -- при вызове IE подсунуть ему html с предопределённым title (лучше всего GUID) и искать окно по заголовку. Но и то тут могут быть проблемы, зависящие от настроек.
Q>Правильный подход -- создавать браузер через automation. Вот, поройтесь вокруг: InternetExplorer Object
Да, это интересное замечание.
более смешное решение -- пройтись по всем процессам, засуспендить все найденные IE'шки, потом запустить свой экземпляр, после чего резьюмить все ie'шки по одному и смотреть, после какого из резьюмов умрёт запущенный нами процесс
А>более смешное решение -- пройтись по всем процессам, засуспендить все найденные IE'шки, потом запустить свой экземпляр, после чего резьюмить все ie'шки по одному и смотреть, после какого из резьюмов умрёт запущенный нами процесс
Сколько будем ждать после резьюма?
Сколько матов от юзера готовы выслушат изза тормозов?
Что будем делать если какой то из ие вздумает выйти сам по себе, не изза нас?
Как много веселых ребят, и все делают велосипед...
Re[5]: Проблема при получении HWND из HPROCESS
От:
Аноним
Дата:
07.02.11 18:28
Оценка:
Здравствуйте, ononim, Вы писали:
O>Сколько будем ждать после резьюма?
недолго
O>Сколько матов от юзера готовы выслушат изза тормозов?
в любом случае, o маленькое от тормозов при обычном запуске IE
O>Что будем делать если какой то из ие вздумает выйти сам по себе, не изза нас?
саспендед процесс вздумает выйти сам по себе?
O>>Сколько будем ждать после резьюма? А>недолго
Для сведения: в виндовом ShellExecute таймаут на DDE initiate — 30 секунд, на execute — 3 минуты.
O>>Сколько матов от юзера готовы выслушат изза тормозов? А>в любом случае, o маленькое от тормозов при обычном запуске IE
Если у юзера 10 процессов IE — будем ждать на каждом по чуть-чуть, в результате общее время ожидания будет 10х(чуть-чуть), что уже совсем не чуть-чуть.
И ах да.. забыл упомянуть — новые версии IE запускают пачку процессов (для табов). Причем главный процесс отображает главное окно IE и обрабатывает DDE, а табчики создают и отображают — другие процессы. Так вот — пока вы не отрезьюмите и главное окно и табчик (а может даже и все остальные табчики) DDE транзакция скорее всего не завершится. Не говоря уж о том что неясно какой именно HWND хочет найти топикстартер — главный фрейм или окно таба (с его контентом)
Как много веселых ребят, и все делают велосипед...