Показать сообщение отдельно
  #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 лишняя.
Ответить с цитированием