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

Вниз

Активизация окна   Найти похожие ветки 

 
Colonel ©   (2006-05-04 21:54) [0]

Доброй ночи.

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

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

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

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

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


 
Leonid Troyanovsky ©   (2006-05-04 22:54) [1]


> Colonel ©   (04.05.06 21:54)  

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


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

--
Regards, LVT.


 
Colonel ©   (2006-05-05 10:50) [2]

А если нет ?


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


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


 
balepa ©   (2006-05-05 11:45) [3]

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


 
Colonel ©   (2006-05-05 15:06) [4]

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

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

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

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

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


 
Leonid Troyanovsky ©   (2006-05-05 17:06) [5]


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

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


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

--
Regards, LVT.


 
ANB ©   (2006-05-05 19:37) [6]


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

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


 
Leonid Troyanovsky ©   (2006-05-05 19:49) [7]


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

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


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

--
Regards, LVT.


 
ANB ©   (2006-05-05 20:08) [8]


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


 
Leonid Troyanovsky ©   (2006-05-05 21:20) [9]


> 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-06 13:36) [10]

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

WM_LMOUSEDOWN
WM_SETFOCUS
BM_CLICK
WM_LMOUSEUP

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


 
Colonel ©   (2006-05-10 20:01) [11]


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


Да.


 
Colonel ©   (2006-05-10 20:05) [12]


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


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

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

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

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


 
Leonid Troyanovsky ©   (2006-05-10 21:11) [13]


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

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

> Да.


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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-05-10 21:52) [14]


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

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


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

--
Regards, LVT.


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


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


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

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

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


 
Leonid Troyanovsky ©   (2006-05-11 22:13) [16]


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

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


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

--
Regards, LVT.



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

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

Наверх




Память: 0.51 MB
Время: 0.033 c
15-1155120778
Аноним
2006-08-09 14:52
2006.09.03
Вопрос


3-1150957711
galexis
2006-06-22 10:28
2006.09.03
Медленно работает LIKE


6-1143721565
vic_774N
2006-03-30 16:26
2006.09.03
решение проблемы подсей


2-1155305674
fast2
2006-08-11 18:14
2006.09.03
Как в СтрингГриде подровнять значения в столбце по правому краю?


15-1154685468
novoalex
2006-08-04 13:57
2006.09.03
MDI приложение...