Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаленное управление [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо