Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Поиск окна в приложении   Найти похожие ветки 

 
Андрей Молчанов   (2005-08-01 19:17) [0]

Надо по существующему Title приложения и имени класса формы, найти хэндл этой формы в этом приложении.

Пожалуйста, помогите!


 
Piter ©   (2005-08-01 20:54) [1]

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

HWND FindWindow(

   LPCTSTR lpClassName, // pointer to class name
   LPCTSTR lpWindowName  // pointer to window name
  );


Parameters

lpClassName

Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.

lpWindowName

Points to a null-terminated string that specifies the window name (the window"s title). If this parameter is NULL, all window names match.



Return Values

If the function succeeds, the return value is the handle to the window that has the specified class name and window name.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

See Also

EnumWindows, FindWindowEx, GetClassName, GlobalAddAtom


 
Андрей Молчанов   (2005-08-01 21:18) [2]

Нет, мне надо найти форму именно в найденном приложении.


 
Leonid Troyanovsky ©   (2005-08-01 21:42) [3]


> Андрей Молчанов   (01.08.05 19:17)  
> Надо по существующему Title приложения и имени класса формы,
> найти хэндл этой формы в этом приложении.



var
 h, appWnd: HWND;
 buf: array [0..255] of Char;

..
 h := 0;
 repeat
   h := FindWindowEx(0, h, Pointer(FrmClassName), nil);
   if h <> 0 then
     begin
       appWnd:= GetWindowLong(h, GWL_HWNDPARENT);
   
       if appWnd <> 0 then
         begin
           GetClassName(appWnd, buf, SizeOf(buf));
           if StrComp(buf,"TAppllication") = 0 then
             begin
               GetWindowText(appWnd, buf, SizeOf(buf));
               if StrComp(buf, PChar(AppTitle) = 0 then
                 {это оно};
             end;
         end;
     end;

 until (h = 0);


Не тестировалось.
Работа над ошибками оставлена в качестве домашнего задания.

--
Regards, LVT.


 
Андрей Молчанов   (2005-08-01 21:49) [4]

Большое спасибо!!!!!!!!  :)
А здесь что есть ошибки? Если да, то пожалуйста, посмотрите их, я половину функций здесь не знаю :(


 
Leonid Troyanovsky ©   (2005-08-01 22:03) [5]


> Андрей Молчанов   (01.08.05 21:49) [4]

> А здесь что есть ошибки? Если да, то пожалуйста, посмотрите
> их, я половину функций здесь не знаю :(


Ошибки есть везде. Например, пропущена скобка во втором StrComp.
Но, имелось ввиду другое. После вызова API функций
положено анализировать результат, вызывая при необходимости
GetLastError.
Это, как раз, повод познакомится с оными функциями.

--
Regards, LVT.


 
Андрей Молчанов   (2005-08-01 22:19) [6]

После вызова API функций положено анализировать результат, вызывая при необходимости GetLastError.
А может просто поместить все в try ... except end; ?


 
Piter ©   (2005-08-01 22:30) [7]

Андрей Молчанов   (01.08.05 22:19) [6]
А может просто поместить все в try ... except end; ?


Можно почитать умные книжки.
Но никак не помещать вызов API функций в try.. except


 
Leonid Troyanovsky ©   (2005-08-01 22:30) [8]


> Андрей Молчанов   (01.08.05 22:19) [6]
> После вызова API функций положено анализировать результат,
> вызывая при необходимости GetLastError.
> А может просто поместить все в try ... except end; ?


Просто - нельзя. Надо анализировать результат.
Например, после FindWindowEx делаем Win32Check(h<>0).
Или, что важнее, Win32Check(GetClassName (..) > 0).

--
Regards, LVT.


 
Андрей Молчанов   (2005-08-01 22:38) [9]


> Просто - нельзя. Надо анализировать результат.

Да мне эта функция не очень важна - это для восстановления предыдущего экзэмпляра программы

> Или, что важнее, Win32Check(GetClassName (..) > 0).

А не могли бы Вы привести пример как этим пользоваться? Пожалуйста!


 
Leonid Troyanovsky ©   (2005-08-01 22:53) [10]


> Андрей Молчанов   (01.08.05 22:38) [9]

> > Просто - нельзя. Надо анализировать результат.

> Да мне эта функция не очень важна - это для восстановления
> предыдущего экзэмпляра программы


Правила едины для всех программ ;)

> > Или, что важнее, Win32Check(GetClassName (..) > 0).
> А не могли бы Вы привести пример как этим пользоваться?

Дык, считай, это пример и есть.
Правда, не совсем полный. Т.е., GetClassName может вернуть
число (кол-во символов, скопированных в буфер) равное 256,
а значит, наш буфер оказался мал и надо повторять попытку
с буфером большего размера.

--
Regards, LVT.


 
Андрей Молчанов   (2005-08-01 23:01) [11]

Ага, спасибо. Ну и последний вопрос (я наверно совсем надоел уже) - если я все-таки не хочу делать проверок кроме h<>0, то надо ли мне заклчать все в try-except-end, или окна с ошибкой вс равно не будет?


 
Piter ©   (2005-08-01 23:06) [12]

Андрей Молчанов   (01.08.05 23:01) [11]

вызов WinApi функций не приводит к вызову DELPHI исключений.


 
Leonid Troyanovsky ©   (2005-08-01 23:11) [13]


> Андрей Молчанов   (01.08.05 23:01) [11]
> Ага, спасибо. Ну и последний вопрос (я наверно совсем надоел
> уже) - если я все-таки не хочу делать проверок кроме h<>0,
> то надо ли мне заклчать все в try-except-end, или окна с
> ошибкой вс равно не будет?


Окна не будет.
try finally end мог бы быть полезен в комбинации с Win32Check,
бо последний вызывает исключение, если проверяемое ложно
(в тексте исключения - описание ошибки от GetLastError).

--
Regards, LVT.


 
Андрей Молчанов   (2005-08-01 23:16) [14]

Большое спасибо!!!!! Теперь я все понял. :)



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

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
14-1122458902
ЯВ
2005-07-27 14:08
2005.08.21
Тоже о ГАИ, но по другому вопросу....


4-1119850461
MTsv DN
2005-06-27 09:34
2005.08.21
Открыть два фала из Проводника или как послать WM_DROPFILES...


4-1120125721
TDionis
2005-06-30 14:02
2005.08.21
перехват mb_вторая_слева


3-1121175517
cvg
2005-07-12 17:38
2005.08.21
Доступ к компоненту SQLQuery из текста проги


1-1122649544
Fedor
2005-07-29 19:05
2005.08.21
При нажатии Alt+Tab слышен противный писк Винды





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский