Форум: "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