Текущий архив: 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