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

Вниз

Как в чужом приложение на MessageDlg нажать Да   Найти похожие ветки 

 
Раф   (2007-08-02 09:18) [0]

Подскажите, FindWindow не находит его


 
WASM   (2007-08-02 10:45) [1]


> Раф   (02.08.07 09:18)


Почему не находит, может не так ищите, где код то, телепаты в отпуске


 
Dib@zol ©   (2007-08-02 11:49) [2]

> телепаты в отпуске

Ошибаешся!!!

> [0] Раф   (02.08.07 09:18)
А всё же, как ты окно то находишь? Код засвети.


 
Zagaevskiy ©   (2007-08-02 13:21) [3]

EnumWindow?


 
Dib@zol ©   (2007-08-02 13:27) [4]

> EnumWindow?

Хм. Оригинально... Только как ты поймёшь, что это за окно при таком подходе? WM_MOUSEDOWN всем рассылать?


 
Лёля   (2007-08-02 14:41) [5]

допустим, у тебя есть вот такое окно сообщения:

 MessageDlg("123", mtCustom, [mbYes, mbNo], 0);

нажмем в нем кнопку "Yes" (из своего приложения):

var
 hDlgWindow, hOkButton: HWND;
...
 hDlgWindow := FindWindow("TMessageForm", "Project1"{заголовок окна сообщения});
 hOkButton := FindWindowEx(hDlgWindow, 0, "TButton", "&Yes");
 PostMessage(hOkButton, WM_SETFOCUS, 0, 0);
 PostMessage(hOkButton, BM_CLICK, 0, 0);


конечно, тут еще нужно добавить проверки ненулёвости искомого хэндла


 
DVM ©   (2007-08-02 14:45) [6]


> Хм. Оригинально... Только как ты поймёшь, что это за окно
> при таком подходе?

А в чем проблема? В WinApi нет функций, позволяющих узнать класс и заголовок окна?


 
Раф   (2007-08-02 15:33) [7]

while HndAsc1=0 do HndAsc1:=FindWindowEx(Hnd,HndAsc,"#32770","Конфигуратор");
            //FindWindow(Hnd, "Конфигуратор");
            if HndAsc<>0 then begin
 //ищем кнопку в диалоге:
 //обращаем внимание на знак & - если на кнопку завязана комбинация клавиш
 //(это когда буква в кнопке подчеркнута)
 //то надо к имени добавлять перед этой буквой & а то кнопочка не найдется если их несколько.
                while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc1,0,"Button","&Да");
                if HndBtn<>0 then begin
                IdBtn:=GetDlgCtrlID(HndBtn);
                   if IdBtn<>0 then begin
                    //ну и наконец жмем кнопку "&Да":
                    Sleep(1000);
                    PostMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
                    //а хелп MSDN по BN_CLICKED или WM_Command
                    //здесь верхнее слово WParam это идентификатор контрола, а нижнее - код BN_CLICKED
                   end;
                end;
            end;


 
Раф   (2007-08-02 15:34) [8]

Не ловит, может по другому как, класс окна и имя точны проверено, но Хандл который находит почему то другой


 
DVM ©   (2007-08-02 15:54) [9]


> Не ловит, может по другому как, класс окна и имя точны проверено,
>  но Хандл который находит почему то другой

Ну вообще то в системе запросто могут присутствовать два окна с одним и тем же классом и заголовком. Другие признаки надо использовать значит дополнительно.


 
Dib@zol ©   (2007-08-02 15:56) [10]

Удалено модератором


 
Лёля   (2007-08-02 15:57) [11]

погоди, ты искал, вроде, HndAsc1, а юзаешь по итогу HndAsc.
И еще.
if HndBtn then<> 0
то есть, хэндл кнопки у тебя уже есть - HndBtn, вот и передавай его в PostMessage
PostMessage(HndBtn, WM_SETFOCUS, 0, 0);
PostMessage(HndBtn, BM_CLICK, 0, 0);

И читай внимательней хэлпы по WinAPI


 
Лёля   (2007-08-02 16:23) [12]

кстати, перед тем, как слать эти сообщения, нужно сделать SetForegroundWindow диалоговому окну.


 
DVM ©   (2007-08-02 16:27) [13]


> Лёля   (02.08.07 16:23) [12]

можно дважды просто послать BM_CLICK


 
Лёля   (2007-08-02 16:36) [14]

> [13] DVM ©   (02.08.07 16:27)

возможно. просто эти строки я взяла из своего же реально работающего кода.


 
Лёля   (2007-08-02 16:42) [15]

проверила два BM_CLICK. таки да, работает. достаточно и одного BM_CLICK после SetForegroundWindow.
но думается мне, что отправлять WM_SETFOCUS и BM_CLICK после SetForegroundWindow все же правильнее.


 
Zagaevskiy ©   (2007-08-02 19:56) [16]


> Dib@zol ©   (02.08.07 13:27) [4]
> > EnumWindow?
>
> Хм. Оригинально... Только как ты поймёшь, что это за окно
> при таком подходе? WM_MOUSEDOWN всем рассылать?

А вот тут ты не прав. Найдёт нужное окно(по заголовку) и всё.


 
Elen ©   (2007-08-03 08:46) [17]

А не проще: The EndDialog function destroys a modal dialog box, causing the system to end any processing for the dialog box.


 
Игорь Шевченко ©   (2007-08-03 09:52) [18]

Elen ©   (03.08.07 08:46) [17]

MessageDlg не является modal dialog box.

Учи матчасть, который раз говорю, все бестолку


 
Leonid Troyanovsky ©   (2007-08-03 11:46) [19]


> Раф   (02.08.07 15:33) [7]

> PostMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);

SendMessage(HndAsc1,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);

--
Regards, LVT.


 
zzzxxxyyy   (2007-08-12 23:49) [20]

Удалено модератором


 
Германн ©   (2007-08-13 01:30) [21]

Удалено модератором



Страницы: 1 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.016 c
2-1191533338
Альберт
2007-10-05 01:28
2007.10.28
потоки


2-1190918428
fishka
2007-09-27 22:40
2007.10.28
DBF и Windows 2000 - OK, DBF и Windows XP- ошибка


15-1190719395
ja
2007-09-25 15:23
2007.10.28
вызываемый номер при создании подключения gprs beeline


2-1191476507
PL
2007-10-04 09:41
2007.10.28
Результат трассировки и скомп. exe разные - почему?


10-1139503723
РАС
2006-02-09 19:48
2007.10.28
Визуальный Remote COM Object