![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаленное управление [D6, WinXP]
Роман © (2004-10-25 12:16:00)Привет всем.
У меня вопрос. Данный код должен искать окно, затем кнопку на нем. Однако кнопка не находится.
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>
Unknown Mystic (2004-10-27 14:28:00) [1]Сегодня попробовал написать нечто в этом роде. По заголовком искать контролы тоже не получилось. Пока не смотрел что к чему и в MSDN дальше не копался.
Как вариант можно попробовать запользовать
GetWindow(WindowHandle, GW_CHILD);
или
EnumChildWindows
Роман (2004-10-26 12:16:00) [2]Не ищется ни одна кнопка. Главное что все работает с приложениями созданными на Delphi мной. С остальными не хочет. Может потому что я в своих программах знаю правильный caption.
А while я использую что пока я запущу главное окно пусть ищет пока не найдет. Пока то да се.
Unknown Mystic (2004-10-25 17:52:00) [3]>> Роман (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 не даст тебе следующего окна с тем же названием.
4e6ypaTop _@(o,o)@_ (2004-10-25 16:48:00) [4]Роман (25.10.04 15:14) [7]
Потому что передаваемое значение
TheChildHandle:=FindWindowEx(wnd,0,nil,PChar( caption))
всегда - название того окна которое мне нужно.
Роман (2004-10-25 15:14:00) [5]>4e6ypaTop _@(o,o)@_
В процедурке ClickOnForm переменная TheChildHandle никогда не изменяет своего значения. Почему?
Роман (2004-10-25 14:17:00) [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;
Не работает. Т.е. работает но кнопку не находит.
Unknown Mystic (2004-10-25 14:07:00) [7]А как ты вообще само окно ищешь? Я этого еще не программировал, но 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 13:49:00) [8]Мне надо найти хэндл кнопки чтобы потом нажать на нее.
4e6ypaTop _@(o,o)@_ (2004-10-25 13:38:00) [9]Кнопка не ищется, вписывешь ее название (ну, то есть ее Caption) и все. А тебе надо просто что-ли кнопки на чужом окне все найти и все?
FindWindowEx(HndDialog,0, 'Button','OK');
Ты же не знаешь Button это или например SpeedButton.
Роман (2004-10-25 13:32:00) [10]А где тут кнопка ищется?
4e6ypaTop _@(o,o)@_ (2004-10-25 12:44:00) [11]Попробуй так ...
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;