Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.035 c
14-1100982847
Игорь Шевченко
2004-11-20 23:34
2004.12.12
Общество потребления


6-1096974106
Algol
2004-10-05 15:01
2004.12.12
Даты изменения файлов по FTP


14-1101370001
Zhekson
2004-11-25 11:06
2004.12.12
Для души:


4-1098215412
santey
2004-10-19 23:50
2004.12.12
irq


14-1100796664
matt
2004-11-18 19:51
2004.12.12
InterBase 6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский