Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Удаленное управление   Найти похожие ветки 

 
Роман   (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 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
3-1100516912
Алекс
2004-11-15 14:08
2004.12.12
DATAPUMP пример конвертации или статью


1-1101366227
Denmin
2004-11-25 10:03
2004.12.12
Как передать фокус из DBEdit на SpeedButton, из DBMemo в DBEdit ?


1-1101872940
HELPMEPLEASE
2004-12-01 06:49
2004.12.12
Как в DBGrid-e сделать фиксированые колонки


1-1101491736
AlexHawk
2004-11-26 20:55
2004.12.12
Как сделать титры


6-1096729488
Луарвик
2004-10-02 19:04
2004.12.12
Правильный запрос (а не вопрос :))