Форум: "WinAPI";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизУдаленное управление Найти похожие ветки
← →
Роман (2004-10-25 12:16) [0]Привет всем.
У меня вопрос. Данный код должен искать окно, затем кнопку на нем. Однако кнопка не находится.
while HndBtn=0 do
HndBtn:=FindWindowEx(HndDialog,0,"Button","OK");
if (HndBtn<>0) and (io<>0) then
begin
IdBtn:=GetDlgCtrlID(HndBtn);
if IdBtn<>0 then
begin
SendMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
end;
end;
<\code>
← →
4e6ypaTop _@(o,o)@_ © (2004-10-25 12:44) [1]Попробуй так ...
procedure ClickOnForm (wnd:HWND;caption:string);
var
TheChildHandle:HWND;
begin
TheChildHandle:=FindWindowEx(wnd,0,nil,PChar(caption));
SendMessage(TheChildHandle,WM_LButtonDown,1,1);
SendMessage(TheChildHandle,WM_LButtonUP,1,1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
wnd:HWND;
caption:string;
begin
wnd:=GetTopWindow(0);
repeat
SetLength(caption,GetWindowtextLength(wnd));
GetWindowText(wnd,@caption[1],length(caption)+1);
if (trim(caption)=pchar(edit1.text)) then ClickOnForm(wnd,pchar(edit2.text));
wnd:=GetNextWindow(wnd,GW_HWNDNEXT);
until wnd=0;
end;
← →
Роман (2004-10-25 13:32) [2]А где тут кнопка ищется?
← →
4e6ypaTop _@(o,o)@_ © (2004-10-25 13:38) [3]Кнопка не ищется, вписывешь ее название (ну, то есть ее Caption) и все. А тебе надо просто что-ли кнопки на чужом окне все найти и все?
FindWindowEx(HndDialog,0,"Button","OK");
Ты же не знаешь Button это или например SpeedButton.
← →
Роман (2004-10-25 13:49) [4]Мне надо найти хэндл кнопки чтобы потом нажать на нее.
← →
Unknown Mystic © (2004-10-25 14:07) [5]А как ты вообще само окно ищешь? Я этого еще не программировал, но MSDN уже почитал и помоему надо так:
WindowHandle := FindWindow(nil, <заголовок формы>);
ControlHandle := FindWindowEx(WindowHandle, nil, "Button", <заголовок кнопки>);
а дальшеSendMessage(ControlHandle, BM_CLICK, 1, 1);
илиSendMessage(ControlHandle, WM_LBUTTONDOWN, 1, 1);
SendMessage(ControlHandle, WM_LBUTTONUP, 1, 1);
ну и проверок добавить...
А еще, если тебе надо именно OK нажать - можно попробовать:SendDlgItemMessage(WindowHandle, ID_OK, WM_LBUTTONDOWN, 1, 1);
SendDlgItemMessage(WindowHandle, ID_OK, WM_LBUTTONUP, 1, 1);
← →
Роман (2004-10-25 14:17) [6]Я так и делаю, только код поиска формы я пропустил.
WinExec(PChar("C:\Program Files\Common Files\Borland Shared\Database Desktop\dbd32.exe"),1);
Sleep(2000);
Hnd:=FindWindow(nil, "Database Desktop");
if Hnd <>0 then begin
windows.SetForegroundWindow(Hnd);
HndMen:=GetMenu(Hnd);
HndSMen:=GetSubMenu(HndMen,0);
idMen:=GetMenuItemID(HndSMen,7);
if idMen<>0 then begin
PostMessage(Hnd,WM_COMMAND,idMen,0);
While HndDialog=0 do HndDialog:= FindWindow(nil, "Set Private Directory");
if HndDialog<>0 then begin
// ищем кнопку Browse...
while HndBtn=0 do HndBtn:=FindWindowEx(HndDialog,0,"Button","Browse...");
if (HndBtn<>0) and (io<>0) then
begin
IdBtn:=GetDlgCtrlID(HndBtn);
if IdBtn<>0 then
begin
SendMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
end;
end;
exit;
Не работает. Т.е. работает но кнопку не находит.
← →
Роман (2004-10-25 15:14) [7]>4e6ypaTop _@(o,o)@_
В процедурке ClickOnForm переменная TheChildHandle никогда не изменяет своего значения. Почему?
← →
4e6ypaTop _@(o,o)@_ © (2004-10-25 16:48) [8]Роман (25.10.04 15:14) [7]
Потому что передаваемое значение
TheChildHandle:=FindWindowEx(wnd,0,nil,PChar(caption))
всегда - название того окна которое мне нужно.
← →
Unknown Mystic © (2004-10-25 17:52) [9]>> Роман (25.10.04 14:17) [6]
While HndDialog=0 do HndDialog:= FindWindow(nil, "Set Private Directory");
while HndBtn=0 do HndBtn:=FindWindowEx(HndDialog,0,"Button","Browse...");
Если я не ошибаюсь, то While тут бесполезен.
Ты пошагово прогонял? и она на втором while засела? Если да, то попробуй поискать какую-то другую кнопку, может у Browse... где-то пробелы.
>> Роман (25.10.04 15:14) [7]
Повторный вызов FindWindow или FindWindowEx не даст тебе следующего окна с тем же названием.
← →
Роман (2004-10-26 12:16) [10]Не ищется ни одна кнопка. Главное что все работает с приложениями созданными на Delphi мной. С остальными не хочет. Может потому что я в своих программах знаю правильный caption.
А while я использую что пока я запущу главное окно пусть ищет пока не найдет. Пока то да се.
← →
Unknown Mystic © (2004-10-27 14:28) [11]Сегодня попробовал написать нечто в этом роде. По заголовком искать контролы тоже не получилось. Пока не смотрел что к чему и в MSDN дальше не копался.
Как вариант можно попробовать запользоватьGetWindow(WindowHandle, GW_CHILD);
илиEnumChildWindows
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c