Проблема при получении HWND из HPROCESS
От: DmitrIO Украина  
Дата: 06.02.11 21:36
Оценка:
Доброй ночи

Появилась необходимость после создания окна 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 for
        break;
    }
    h = ::GetNextWindow( h , GW_HWNDNEXT);
}
Re: Проблема при получении HWND из HPROCESS
От: Аноним  
Дата: 06.02.11 21:49
Оценка: 2 (1) +2
Здравствуйте, DmitrIO, Вы писали:


DIO> HANDLE hProc = ::OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid);

DIO> if ( hProc == ShExecInfo.hProcess )


Потому что pid'ы надо сравнивать, а не хендлы, которые совпадать совершенно не оябязаны.
Re[2]: Проблема при получении HWND из HPROCESS
От: quodum  
Дата: 07.02.11 07:59
Оценка: 10 (2)
Здравствуйте, Аноним, Вы писали:

А>Потому что 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'шки по одному и смотреть, после какого из резьюмов умрёт запущенный нами процесс
Re[4]: Проблема при получении HWND из HPROCESS
От: ononim  
Дата: 07.02.11 14:12
Оценка: +1
А>более смешное решение -- пройтись по всем процессам, засуспендить все найденные IE'шки, потом запустить свой экземпляр, после чего резьюмить все ie'шки по одному и смотреть, после какого из резьюмов умрёт запущенный нами процесс
Сколько будем ждать после резьюма?
Сколько матов от юзера готовы выслушат изза тормозов?
Что будем делать если какой то из ие вздумает выйти сам по себе, не изза нас?
Как много веселых ребят, и все делают велосипед...
Re[5]: Проблема при получении HWND из HPROCESS
От: Аноним  
Дата: 07.02.11 18:28
Оценка:
Здравствуйте, ononim, Вы писали:

O>Сколько будем ждать после резьюма?

недолго

O>Сколько матов от юзера готовы выслушат изза тормозов?

в любом случае, o маленькое от тормозов при обычном запуске IE

O>Что будем делать если какой то из ие вздумает выйти сам по себе, не изза нас?

саспендед процесс вздумает выйти сам по себе?
Re[6]: Проблема при получении HWND из HPROCESS
От: ononim  
Дата: 07.02.11 20:47
Оценка:
O>>Сколько будем ждать после резьюма?
А>недолго
Для сведения: в виндовом ShellExecute таймаут на DDE initiate — 30 секунд, на execute — 3 минуты.

O>>Сколько матов от юзера готовы выслушат изза тормозов?

А>в любом случае, o маленькое от тормозов при обычном запуске IE
Если у юзера 10 процессов IE — будем ждать на каждом по чуть-чуть, в результате общее время ожидания будет 10х(чуть-чуть), что уже совсем не чуть-чуть.

И ах да.. забыл упомянуть — новые версии IE запускают пачку процессов (для табов). Причем главный процесс отображает главное окно IE и обрабатывает DDE, а табчики создают и отображают — другие процессы. Так вот — пока вы не отрезьюмите и главное окно и табчик (а может даже и все остальные табчики) DDE транзакция скорее всего не завершится. Не говоря уж о том что неясно какой именно HWND хочет найти топикстартер — главный фрейм или окно таба (с его контентом)
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.