Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.107 c
2-1155203930
evgenij_
2006-08-10 13:58
2006.09.03
Потоки


1-1153379746
Лапыч
2006-07-20 11:15
2006.09.03
Потокозащищенный список строк


1-1153376353
S@[ShocK]
2006-07-20 10:19
2006.09.03
Проблема мерцания движущегося объекта Shape или Image


2-1155543110
lllEl
2006-08-14 12:11
2006.09.03
QuickReport+4 блока данных


1-1153381090
oleggar
2006-07-20 11:38
2006.09.03
распознавание текста





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