Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];

Вниз

Как определить что приложение загрузило GUI   Найти похожие ветки 

 
Штырлиц   (2010-09-28 19:33) [0]

Как можно определить что приложение загрузило визуальную оболочку или что визуальной оболочки нет.

Есть ряд приложений с визуальной оболочкой, например загружаю фильм проигрывателем, он подвисает и сразу не показывает визуальную оболочку, но она у него есть. Как можно определить есть ли у приложения визуальная оболочка при загрузке или в противном случае её нет. Оболочка может загружаться через WinApi.


 
Хук   (2010-09-29 11:02) [1]

Хук на создание окна?
См. в MSDN: SetWindowsHookEx, WH_CBT, HCBT_CREATEWND.


 
12 ©   (2010-09-29 11:27) [2]

перебрать окна, проверить процесс, родивший


 
DiamondShark ©   (2010-09-29 13:16) [3]

1. В грамотном вопросе содержится значительная часть ответа.

Щито есть "визуальная оболочка"?
Возможно, что решение будет тупо следовать из определения.

2. Основной вопрос системотехники.

А нафига?


 
Сергей М. ©   (2010-09-29 13:27) [4]


> Штырлиц


Вопрос тебе на засыпку: загружает ли нижеследующее приложение "визуальную оболочку" ?

program Foo;
..
begin
 Application.Run;
end.


 
DiamondShark ©   (2010-09-29 13:33) [5]


> Вопрос тебе на засыпку:

Это вопрос из разряда: "Кузявы ли бутявки?"
От определения зависит.


 
han_malign   (2010-09-29 14:04) [6]

WaitForInputIdle


 
George ©   (2010-09-29 14:16) [7]


> Сергей М. ©   (29.09.10 13:27) [4]

Ну там же не видать окошка, значит невизуально. :)


 
Сергей М. ©   (2010-09-29 14:24) [8]


> George ©   (29.09.10 14:16) [7]


> там же не видать окошка, значит невизуально


Ну если следовать такому определению "визуальности", то решение простое как проще некуда:

CapturedScreenImage := CaptureCurrentScreenImage;
if RecognizeWindowImage(CapturedScreenImage) then визуальное;

)


 
George ©   (2010-09-29 14:49) [9]


> Сергей М. ©   (29.09.10 14:24) [8]

С тем допущением, что если окошку свернули, она стала невизуальной и детектиться не будет. А так нормалек. :)


 
Сергей М. ©   (2010-09-29 14:56) [10]


> если окошку свернули


У объекта Application окошко как раз и не свернуто после создания. Нормалек ?)


 
George ©   (2010-09-29 15:38) [11]


> Сергей М. ©   (29.09.10 14:56) [10]

Не, я про

CapturedScreenImage := CaptureCurrentScreenImage;
if RecognizeWindowImage(CapturedScreenImage) then визуальное;

Т.е. если окошко будет свернуто, то RecognizeWindowImage вернет false, ну и будем считать, что если его свернули, то приложение стало невизуальным. :)


 
Штырлиц   (2010-09-30 04:34) [12]

Допустим, я загружаю фильм. Практика показала, что если хватать после запуска приложения его хэндлы и смотреть наличие форм, то не всегда это срабатывает.

Это все из-за того, что при запуске может происходить какая-то обработка в приложении, после чего загружается визуалка. Эта обработка может длиться от 0 до N секунд\минут или приложение просто подвисает. Т.С. Ставить задержку бессмысленно, нужна скорая обработка, а не задержка в пару минуты.

А теперь вопрос, зацепит ли это при таком раскладе.
Хук
Хук на создание окна?
См. в MSDN: SetWindowsHookEx, WH_CBT, HCBT_CREATEWND.


Второй вариант. han_malign
 DWORD dwWaitResult;
 for (;;)
 {
   do
   {
     // Ждем пока процесс не проинициализируеться
     //
     dwWaitResult = WaitForInputIdle (prcHandle, 1000);
   }
   while (dwWaitResult == WAIT_TIMEOUT);

   if (dwWaitResult == 0)
   {
     // прикладуха что-то сделала
     //
     if (NULL != FindWindow ("ClassName","Text"))
       break; // for (;;)
   }
   else // if (dwWaitResult == WAIT_FAILED)
   {
     // что-то сдохло
     //
     break;
   }

 } // for (;;)


Это грамотный вариант с задержкой?


 
Юрий Зотов ©   (2010-09-30 13:14) [13]


> Штырлиц   (30.09.10 04:34) [12]

Если нужно дождаться создания окна, то WaitForInputIdle, только проще:

do while (WaitForInputIdle (prcHandle, 1000) == WAIT_TIMEOUT);


 
0x00FF00 ©   (2010-09-30 18:40) [14]


> Юрий Зотов ©   (30.09.10 13:14) [13]

Отвечаете на delphimasters сишным кодом?
Оригинально =)


 
tesseract ©   (2010-10-01 00:11) [15]

Сразу вспоминается предложение директора отдела тестирования MS  бить за такие  извращенные алгоритмы по рукам линейкой.


 
Юрий Зотов ©   (2010-10-01 00:22) [16]


> 0x00FF00 ©   (30.09.10 18:40) [14]

Увы. Кажется, я уже всё пишу на псевдокоде, а конкретный код - пофиг. Причем практическую программму под конкретный компилятор - тоже пишу на псевдокоде.

Самое странное, что компилируется. И даже работает. Внешне, по крайне мере.
:o)


 
Сергей М. ©   (2010-10-01 00:50) [17]


> Штырлиц   (30.09.10 04:34) [12]


WaitForInputIdle() ждет всего-навсего факт существования окна, не более того.
А имеет ли это окно какое-то отношение к какой-то там "визуалке" или не имеет - то функции WaitForInputIdle ниже колена.


 
Штырлиц   (2010-10-01 07:25) [18]

А вообще возможно без этих телодвижений узнать есть ли окно при загрузке процесса. Ждать не могу, может есть какие-то удобные отладочные примеры.

Прогнал через отладчик процесс - узнал есть ли код создания окна..


 
Штырлиц   (2010-10-01 08:03) [19]

Есть вариант хватать subsystem из PE информации о заголовке. Но тут одно но, возможно гуй грузится через API или из отдельной dll.


 
Юрий Зотов ©   (2010-10-01 13:22) [20]


> Штырлиц   (01.10.10 07:25) [18]

Посмотреть, есть ли CreateWindow(Ex) в секции импорта?


 
Штырлиц   (2010-10-01 16:08) [21]

Первый раз слышу о CreateWindow(Ex) в импорте.

В импорте можно зацепиться за
; Imports from USER32.dll
;
 extrn ScreenToClient
 extrn GetWindowRect
 extrn SetClassLongA
 extrn IsWindowEnabled
 extrn SetWindowPos


Но если взять вызов Api GUI то тут может быть импорт только

; Imports from kernel32.dll
;
 extrn LoadLibraryA
 extrn GetProcAddress
 extrn VirtualAlloc
 extrn VirtualFree


Зато subsystem может показать Win32 GUI. Но это не панацея, если взять в пример, что взяв консольный проект на дельфи и убрав консольный вывод -- PЕ заголовок показывает Win32 GUI хотя хендлов и формы нет у приложения.


 
Lamer@fools.ua ©   (2010-10-01 16:25) [22]

>>tesseract ©   (01.10.10 00:11) [15]

>Сразу вспоминается предложение директора отдела тестирования MS  бить за такие  извращенные алгоритмы по рукам линейкой.
Я бы после слова "предложение" поставил двоеточие :)


 
coder123   (2010-10-01 16:40) [23]


> 01.10.10 00:11

вау!


 
Штырлиц   (2010-10-02 09:24) [24]

Вопрос открыт.
> Сразу вспоминается предложение директора отдела тестирования
> MS  бить за такие  извращенные алгоритмы по рукам линейкой.
>


 
Cobalt ©   (2010-10-14 15:00) [25]

В абстрактном случае - установить тайм-аут, после которого проверять на существование видимых окон, принадлежащих созданному процессу, поскольку именно это означает для пользователя "визуальной оболочки".

К сожалению, программистские термины далеко не всегда совпадают с разумением юзера :-(


 
Cobalt ©   (2010-10-14 15:00) [26]

P.S.
Если тебе это надо для написания своей оболочки виндов, то для окон верхнего уровня есть специальный флаг, который и надо проверять в хуке на создание окон.


 
han_malign   (2010-10-14 17:21) [27]


> do while (WaitForInputIdle (prcHandle, 1000) == WAIT_TIMEOUT);

WaitForInputIdle(prcHandle, INFINITE);
if(WaitForSingleObject(prcHandle, 0) = WAIT_OBJECT_0)then
   ...//у приложения таки не было GUI

MSDN: The WaitForInputIdle method only works with processes that have a user interface.

- правда надо проверить что WaitForInputIdle(..., INFINITE) отобьется при завершении процесса...


> есть ли CreateWindow(Ex) в секции импорта?

- окно консоли создается системой или наследуется от родительского приложения...

есть еще GetGuiResources(), но толку от него в данном контексте мало...


 
_VirEx_   (2010-10-17 22:26) [28]

Form1.Loaded
if Form1.ComponentState=csLoading



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.004 c
2-1289628270
Gu
2010-11-13 09:04
2011.01.30
TreeView, имя текущего элемента


15-1286972348
vv_fran
2010-10-13 16:19
2011.01.30
Как перекодировать русский текст формы в Win1251 ?


2-1288961946
stenfit
2010-11-05 15:59
2011.01.30
move


2-1289186027
Gu
2010-11-08 06:13
2011.01.30
Определить консольное приложение


11-1228467941
Дмитрий
2008-12-05 12:05
2011.01.30
Как изменить высоту items in listview?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский