Форум » Для флейма » GetExitCodeProcess » Ответить

GetExitCodeProcess

fil: Не пользовал ли кто ф-ю GetExitCodeProcess для определения завершения процесса (напр. загрузки Word) ?

Ответов - 13

Dima: fil Поиск на форуме по GetExitCodeProcess дает результаты , возможно они помогут.

fil: Не, не помогут, я смотрел. После ShellExecute через WMI нахожу дескриптор последнего запущенного процесса (Word) и хочу в цикле отследить момент завершения его полной загрузки. Да вот не могу понять чего возвращает GetExitCodeProcess и какой смысл в ее втором параметре ?

Dima: Гуглил ? http://netcode.ru/cpp/?lang=&katID=16&skatID=155&artID=4894


Haz: fil пишет: чего возвращает GetExitCodeProcess Возвращает состояние завершения процесса ( а не завершения загрузки ) http://www.vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_getexitcodeprocess.htm Не уверен но можно попробовать выловить окончание загрузки через тот же WMI используя __instancecreationevent Можно выловить событие - начало загрузки нужного процесса, как только это событие исчезло - значит процесс загружен

fil: Haz Возвращает состояние завершения процесса ( а не завершения загрузки ) где-то я вычитал, что состояние загрузки, ну нет так нет Я, собственно, это все затеял чтобы получать с окна Word'a хендл сообщения о Защищенном просмотре и на нем програмно кликать, а вот поймать никак не могу. Можно ли, зная дескриптор процесса, сделать список его дочерних окон ?

Haz: fil пишет: Можно ли, зная дескриптор процесса, сделать список его дочерних окон ? можно , примерно так ( первое что пришло в голову ) [pre2] aWin := EnumWindows() nLen := len( aWin ) for n := 1 to nLen if GetWindowThreadProcessID(aWin[n]) == hProcess тут те самые окна end end [/pre2] [pre2] //GetWindowThreadProcessId (hWnd, @nThread, @nProcessID) HB_FUNC ( GETWINDOWTHREADPROCESSID ) { HWND hWnd = (HWND) hb_parnl (1); DWORD nThread, nProcessID; nThread = GetWindowThreadProcessId (hWnd, &nProcessID); if ( HB_ISBYREF(2) ) hb_storni (nThread, 2); if ( HB_ISBYREF(3) ) hb_storni (nProcessID, 3); hb_retnl( nProcessID ); } [/pre2]

Haz: Haz пишет: а вот поймать никак не могу. Попробуй поймать через GetWindowText() если у окна есть титла или в примерах было EnumChild() которая получает подчиненные окна ( GET поля , LABEL , кнопки и пр. элементы на форме ) и можно текст найти в и них

fil: EnumChildWindows() и GetWindowText() это первое, что приходит в голову. Эт я уже все пробовал. Мистика

Haz: fil пишет: Эт я уже все пробовал. Мистика а в чем проблема то , вроде эти работают нормально EnumChildWindows() и GetWindowText() Если я правильно понял , тебе поймать окно с сообщением надо ? Скрин кинь, я у себя в такой режим Excel загнать не смог PS Вроде писал что через OLE нормально работает , почему бы не использовать OLE для открытия ?

fil: Я же писал выше, что в офиссе 2010 стоят всягие галочки на тему защищенного просмотра файлов из инета. У меня docx-файлы живут на сервере и обращаюсь к ним через IP. Т.е. при открытии такого файла через Shellexecute он(файл) воспринимается как инетовский и в Word'e, под заголовком, вылезает такя противная желтая строка "Защищенные просмотр..." Вот это окно я и хотел поймать Попробовал так: hhh:=FindWindow("OpusApp" , nil ) - ловится класс глобального окна Word'a FindWindowEx( hhh, 0, "NetUIHWND" , nil ) - а вот класс этой желтой строки на Word'e не ловится FindWindow("NetUIHWND" , nil ) - так тоже не ловится Т.е. получается это сообщение(окно) не принадлежит Word, но и не является отдельным приложением Можно, и к OLE вернуться просто через Shellexecute компактнее

Haz: fil пишет: FindWindowEx( hhh, 0, "NetUIHWND" , nil ) - а вот класс этой желтой строки на Word'e не ловится FindWindow("NetUIHWND" , nil ) - так тоже не ловится Т.е. получается это сообщение(окно) не принадлежит Word, но и не является отдельным приложением Может не то ловишь, возможно нужно ловить "Static" элемент Child окна с сообщением . Попробуй посмотреть через Microsoft Spy++ что это за окно, кому принадлежит и пр. ( с этого и нужно начать ) Скорее всего ловить нужно так 1 по hWin главного окна получить все массив Child заполненный данными о классе через ENUMCHILDWINDOWS 2 в массиве Child найти нужный ClassName и Caption -> получить hWinChild Далее на этом hWinChild нужно программно кликнуть

fil: Ужо поиграюсь, но потом, сейчас вернулся к OLE А можно ли поймать момент окончания загрузки (видимо это когда в память перестает писать) приложения пущенного через Shellexecute ? В инете слов про это много, но ничего конкретного

Haz: fil пишет: В инете слов про это много, но ничего конкретного Да, там в основном предлагают ловить по прекращению увеличения памяти выделяемой процессу , или по падению загрузки ЦП на процесс. Другого и нормального способа я не видел PS у служб есть состояния Running, Stopped, Pending. У процессов к сожалению нет



полная версия страницы