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

Вниз

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

 
Андрей Молчанов   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.048 c
11-1105695193
DmiSb
2005-01-14 12:33
2005.08.21
Печать страницы Excel не показывая самого Excel ?


1-1122973306
Bless
2005-08-02 13:01
2005.08.21
Удаление страницы из Excel


4-1119448969
Алена
2005-06-22 18:02
2005.08.21
Отловить завершение процесса


3-1121251687
AKiM
2005-07-13 14:48
2005.08.21
ввод даты в MySQL


5-1093430251
iBitmap
2004-08-25 14:37
2005.08.21
Добавить свойство Caption.





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