Главная страница
    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.037 c
8-1094651546
SNV888
2004-09-08 17:52
2004.12.12
проигрывание MOD файлов


1-1101725416
Gloomer
2004-11-29 13:50
2004.12.12
Компонент выбора папки


6-1096874386
vadimlg
2004-10-04 11:19
2004.12.12
Как через ICQClient передать файл?


1-1101817959
div
2004-11-30 15:32
2004.12.12
Delphi2005


14-1101233171
Igorek
2004-11-23 21:06
2004.12.12
Вспомним В.Цоя





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский