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

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

Активизация окна [D7, Win2k, WinXP]


Colonel ©   (2006-05-04 21:54:00) 

Доброй ночи.

Есть открытая прога, в ней диалоговое окно ввода пароля. Окно дочернее. Прога не активна.

Как активировать окно ?

Использую код:

...
WindowHandle:=FindWindow(nil,WindowName);
If (WindowHandle<>0) then SendMessage(WindowHandle, WM_SYSCOMMAND, SC_RESTORE, WindowHandle);

Этот код не работает.


Leonid Troyanovsky   (2006-05-11 22:13:00) [1]


> Colonel ©   (11.05.06 15:14) [15]

> не было бы. Но, в данном случае хз как это проверить.


А чего там мудрствовать: первый - он и FindWindowEx первый.
Второй же, должен иметь стиль ES_PASSWORD, IMHO.

--
Regards, LVT.


Colonel   (2006-05-11 15:14:00) [2]


> Leonid Troyanovsky ©   (10.05.06 21:52) [14]
>
> Либо первый для логина, либо второй.
> Третьего, IMHO, не дано.
>
> --
> Regards, LVT.
>


Проблема в том, что нужно проверить введен ли там логин или нет. При открытии файла, в диалоговом окне выдается 2 поля (как я уже описывал выше). Но, есть одно но, если файл уже открывался и программа закрывалась корректно, то при открытии заново файла логин уже введен (последний вводимый). И курсор стоит во втором Edit. Но, если прога завершилась не корректно, то выдается диалоговое окно открытия файла ... Вот если бы там были названия Edit`ов, тогда проблем не было бы. Но, в данном случае хз как это проверить.

Вот поэтому и парюсь. Сейчас все работает при жестких условиях: если моя прога находит окно этой проги, затем находит диалоговое окно для авторизации, то посылается текст пароля и все ок. Дальше идет работа с прогой ... А вот если прога не находит главное окно проги, то моя прога закрывается. Так же если не находится окно авторизации - прога закрывается ...

А мне нужно рассмотреть любые ситуации - чтобы в любой ситуации прога запускалась, открывала файл, вводила логин / пароль и потом работала с ней. По окончании прога моя закрывает эту прогу и все ок. Вот что нужно ....


Leonid Troyanovsky   (2006-05-10 21:52:00) [3]


> Colonel ©   (10.05.06 20:05) [12]

> Там 2 Edita. И у них нет названия. Я могу их хендлы узнать,
>  но какой из них для логина или пароля - нет.


Либо первый для логина, либо второй.
Третьего, IMHO, не дано.

--
Regards, LVT.


Leonid Troyanovsky   (2006-05-10 21:11:00) [4]


> Colonel ©   (10.05.06 20:01) [11]

> > Это файлы с зарегистрированным расширением?
> > Это твоя программа их открывает?

> Да.


http://groups.google.com/group/fido7.ru.delphi.chainik/msg/278f89887ab26b31

--
Regards, LVT.


Colonel   (2006-05-10 20:05:00) [5]


> Хендл эдита получить осталось. Потом сделать ему
> SendMessage(WM_SETTEXT), найти кнопку и нажать ее. И не
> надо делать его ForeGround.


Там 2 Edita. И у них нет названия. Я могу их хендлы узнать, но какой из них для логина или пароля - нет.

Господа, я говорил про программное нажатие кнопки (с этим проблем нет). Речи о кликах и движениях мышкой не было.

Вопрос остается открытым.

Спасибо всем за участие.


Colonel   (2006-05-10 20:01:00) [6]


> Это файлы с зарегистрированным расширением?
> Это твоя программа их открывает?


Да.


ANB   (2006-05-06 13:36:00) [7]

Я обычно делал так :

WM_LMOUSEDOWN
WM_SETFOCUS
BM_CLICK
WM_LMOUSEUP

И все на ура работает.


Leonid Troyanovsky   (2006-05-05 21:20:00) [8]


> ANB ©   (05.05.06 20:08) [8]

> Нормально они реагируют на сообщения (проверено).


Не все там нормально.

Предположим, что нам нужно нажать кнопку на диалоге
"О программе блокнот", который будет non-foreground.

Для этого используем такой код:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 h: HWND;
 p: TPoint;
 cn : array [0..255] of char;
begin
 GetCursorPos(p);
 h := WindowFromPoint(p);
 GetClassName(h, cn, SizeOf(cn));
 if StrIComp(cn, 'BUTTON') = 0 then
   SendMessage(h, BM_CLICK, 0, 0);
end;


Подводем курсор на кнопку диалога и дождемся таймера.
В моей w2k заметно, что необходимо два срабатывания -
по одному на кнопке рисуется фокус(!), а второе -
вызывает закрытие диалога.
После всего этого в (неактивном) EDIT имеем мигающий карет.
Т.е., в системе стали возможны и два карета, два focus rectangle и т.д.
Видимо, первый BM_CLICK вызывает WM_ACTIVATE & WA_CLICKACTIVE
приводящий к отображению фокуса в неактивном окне.

Такое поведение, насколько я помню, было и в 9x, и в NT3.5+.
Но его, рано или поздно, уберут, т.е., не будет WA_CLICKACTIVE,
не будет и нажатия.

Т.е., если уж посылать, то, уж лучше, WM_COMMAND этой кнопки.

--
Regards, LVT.


ANB   (2006-05-05 20:08:00) [9]


> Leonid Troyanovsky ©   (05.05.06 19:49) [7]
</>
Нормально они реагируют на сообщения (проверено). Вот на mouse_event - это вряд ли.


Leonid Troyanovsky   (2006-05-05 19:49:00) [10]


> ANB ©   (05.05.06 19:37) [6]

> найти кнопку и нажать ее. И не
> надо делать его ForeGround.


Кнопка non-foreground приложения не обязана
реагировать на мышиные события.
Так что, это еще вопрос.

--
Regards, LVT.


ANB   (2006-05-05 19:37:00) [11]


> Colonel ©   (05.05.06 15:06) [4]

Хендл эдита получить осталось. Потом сделать ему
SendMessage(WM_SETTEXT), найти кнопку и нажать ее. И не надо делать его ForeGround.


Leonid Troyanovsky   (2006-05-05 17:06:00) [12]


> Colonel ©   (05.05.06 15:06) [4]

> Так вот, мне нужно автоматизировать процесс, потому как
> нужно работать с файлом. Для этого мне нужно после запуска
> проги и открытия файлы отловить окно и ввести


Это файлы с зарегистрированным расширением?
Это твоя программа их открывает?

--
Regards, LVT.


Colonel   (2006-05-05 15:06:00) [13]

В общем суть вот в чем.

Есть прога. Она открывает какие-то файлы. Эти файлы могут быть запаролены. При открытии запароленного файла выводится диалоговое окно для ввода логина / пароля.

Так вот, мне нужно автоматизировать процесс, потому как нужно работать с файлом. Для этого мне нужно после запуска проги и открытия файлы отловить окно и ввести автоматически логин / пароль. Дело в том, что если ничего не делать на компе (фокус остается на форме ввода данных), тогда все прекрасно работает. А вот если я окрываю папку или браузер, тогда ничего не работает.

Так вот вопрос вот в чем: как мне активизировать это окно и передать на него фокус ?

з.Ы: Заголовок родительского окна есть, хендл могу его получить, заголовок диалогового окна на ввод логина / пароля есть, хендл могу его получить.
При активации окна, сразу фокус передается в Edit.


balepa   (2006-05-05 11:45:00) [14]

Как именно не работает ?
Может работает но не так как Вам нужно ?


Colonel   (2006-05-05 10:50:00) [15]

А если нет ?


.....
WindowHandle:=FindWindow(nil,WindowName);
If (WindowHandle<>0) then SendMessage(WindowHandle, WM_SYSCOMMAND, SC_RESTORE, WindowHandle);
SetForegroundWindow(WindowHandle);


НЕ работает этот код тоже.


Leonid Troyanovsky   (2006-05-04 22:54:00) [16]


> Colonel ©   (04.05.06 21:54)  

> Этот код не работает.


Если процесс, из которого выполняется активация
чужого окна, есть foreground, то SetForegroundWindow.

--
Regards, LVT.


Наверх

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