Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2014, 11:13
testovik testovik вне форума
Прохожий
 
Регистрация: 13.05.2014
Сообщения: 4
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Работа в чужом окне

Помогите разрешить такой вопрос:
В моей программе пользователь загружает презентации PowerPoint, но они должны открываться для него только для чтения.
При запуске выходит пароль за запуск презентации

Программа должна эмулировала вставку известного пароля.
Затем появляется второе активное окно "Пароль" с курсором в поле ввода пароля

Необходимо не вводить пароль, а нажать кнопку "Только для чтения".
Вот тестовый фрагмент программы:
Код:
var
Form1: TForm1;
h1,h2,h3,h4,h5,h6:HWND;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
{ищем 1-е окно с именем "Пароль"}
1. h1 := FindWindow(nil, 'Пароль'); //Находим первое окно "Пароль"
2. h2 := FindWindowEx(h1,0,'Edit',nil);//находим дескриптор поля Edit
3. SendMessage(h2, WM_SETTEXT, 0, lparam(pchar('testor')));
4. h3:=findwindowex(h1,0,nil,'ОК'); //жмем кнопку
5. sendmessage(h3,BM_CLICK,0,0);
{ищем 2-е окно с именем "Пароль" }
6. h4 := FindWindow(nil, 'Пароль'); // Находим второе окно "Пароль"
7. h5 := FindWindowEx(h4,0,'Только для чтения',nil); //находим дескриптор кнопки
8. SetForegroundWindow(h5); //устанавливаем на ней фокус
9. sendmessage(h5,BM_CLICK,0,0); //жмем кнопку
end;
end.
MAD: пользуемся тегами для оформления кода!
До строки 8 все работает нормально.
Дальше ни как не могу перевести фокус на кнопку "Только для чтения".
Может посоветуете, что мне нужно сделать.
Спасибо .

Последний раз редактировалось M.A.D.M.A.N., 13.05.2014 в 11:27.
Ответить с цитированием
  #2  
Старый 13.05.2014, 11:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от testovik
Вот тестовый фрагмент программы:
Код:
var
Form1: TForm1;
h1,h2,h3,h4,h5,h6:HWND;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
{ищем 1-е окно с именем "Пароль"}
1. h1 := FindWindow(nil, 'Пароль'); //Находим первое окно "Пароль"
2. h2 := FindWindowEx(h1,0,'Edit',nil);//находим дескриптор поля Edit
3. SendMessage(h2, WM_SETTEXT, 0, lparam(pchar('testor')));
4. h3:=findwindowex(h1,0,nil,'ОК'); //жмем кнопку
5. sendmessage(h3,BM_CLICK,0,0);
{ищем 2-е окно с именем "Пароль" }
6. h4 := FindWindow(nil, 'Пароль'); // Находим второе окно "Пароль"
7. h5 := FindWindowEx(h4,0,'Только для чтения',nil); //находим дескриптор кнопки
8. SetForegroundWindow(h5); //устанавливаем на ней фокус
9. sendmessage(h5,BM_CLICK,0,0); //жмем кнопку
end;
end.

До строки 8 все работает нормально.
Это тебе кажется что всё работает нормально. Поставь точку останова на строку 8, а когда на ней произойдёт останов наведись мышкой на переменную h5 и ты увидишь что её значение равно нулю. Это значит что FindWindowEx не удалось найти заданное окно.

Здесь вообще несколько причин почему кнопка не была найдена:
  1. Во-первых после первого клика ты тут же ищешь второе окно, а окна они ведь скрываются и появляются не мгновенно, для этого им нужно некоторое время, поэтому строка 6 найдёт то же самое окно с заголовком "Пароль" что и строка 1 - естественно на первом окне нет никакой кнопки с заголовком 'Только для чтения'.
  2. Во-вторых ты перепутал параметры в функции FindWindowEx в строке 7 - ты ищешь окно с классом 'Только для чтения', а не окно с заголовком 'Только для чтения'.
  3. В-третьих если ты посмотришь программой "Microsoft Spy++", то увидишь, что у этой кнопки заголовок не 'Только для чтения', а '&Только для чтения'.
Исходя из всего этого получаем такой рабочий код (ну у меня работает ) вместо строк 6 и 7:
Код:
   h4 := 0;
   h5 := 0;
   while True do
   begin
     h4 := FindWindow(nil, 'Пароль'); // Находим второе окно "Пароль"
     if h4 <> 0 then h5 := FindWindowEx(h4, 0, nil, '&Только для чтения');

     if h5 <> 0 then Break;

     Sleep(100);
     Application.ProcessMessages;
   end;
Цитата:
Сообщение от testovik
Дальше ни как не могу перевести фокус на кнопку "Только для чтения".
Переводить фокус на окно для посылки ему сообщения не нужно - строка 8 лишняя.
Ответить с цитированием
  #3  
Старый 13.05.2014, 13:06
testovik testovik вне форума
Прохожий
 
Регистрация: 13.05.2014
Сообщения: 4
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Спасибо за сообщение

Спасибо за сообщение. Я решил этот вопрос до этого сообщения.
Действительно без значка "&Только для чтения" программа не работала.
Если бы я увидел ваше сообщение раньше, то естествено решил бы этот вопрос раньше. А так пришлось эксперементировать.
Еще я добавил sleep(500) и установку фокуса на кнопку:
Код:
if (h5<>0) then
    begin
      //установка фокуса на кнопку и её активация         
      SetForegroundWindow(h5);
      SendMessage(h5, WM_ACTIVATE, 1, 0);
      SendMessage(h5, WM_ENABLE, 1, 0);
      SendMessage(h5, WM_SETFOCUS, 1, 0);
    end;
    sendmessage(h5,BM_CLICK,0,0); // запуск.
Админ: Пользуемся тегами для оформления кода!

Теперь все работает нормально.
Буду проверять стабильность работы.
Вам еще рас большое спасибо.
Без таких как вы нам юзерам тяжело.

Последний раз редактировалось Admin, 13.05.2014 в 19:19.
Ответить с цитированием
  #4  
Старый 13.05.2014, 13:09
testovik testovik вне форума
Прохожий
 
Регистрация: 13.05.2014
Сообщения: 4
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Работа в чужом окне

Для практики я попробую программу с вашими замечаниями.
Спасибо
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter