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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.01.2009, 22:44
alxsev alxsev вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 4
Репутация: 10
По умолчанию Не срабатывает программное нажатие кнопки в чужом окне

Пишу програмку используя компонент TWebBrowser. открываю странички нажимаю на ссылки файлов для скачки. открывается стандартное windows окно "Загрузка файла", в котором никак не получается нажать кнопку скачать. я получаю handle кнопки, но нажать программно не получается.в любых других окошках этот год проходит,а в этом окне кнопка только выбирается в фокус. Помогите приручить нажатие кнопки

Код:
  h1 := FindWindow (nil, 'Загрузка файла');  
  if  h1<> 0  then
    begin
    h2 := FindWindowEx(h1, 0,'Button', '&Сохранить');
    SendMessage(h2,BM_CLICK,0,0)
    end;
Изображения
Тип файла: jpg save.JPG (25.2 Кбайт, 33 просмотров)
Ответить с цитированием
  #2  
Старый 29.01.2009, 14:28
Grosbeak_Coder Grosbeak_Coder вне форума
Прохожий
 
Регистрация: 29.01.2009
Сообщения: 6
Репутация: 10
Хорошо Самый легкий способ скачать файл

Попробуй так:

Кидаешь на форму NMHTTP.

обработчик для кнопеля "скачать":

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
NMHTTP1.InputFileMode:=True;
NMHTTP1.Body(Filename);   //название файла, куда сохранится то, на что указывает ссылка
NMHTTP1.Get(url); //Ссылка на скачиваемый файл (Выдираешь из TWebbrowser)
NMHTTP1.InputFileMode:=False; //Готово
end;
Ответить с цитированием
  #3  
Старый 29.01.2009, 20:23
alxsev alxsev вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 4
Репутация: 10
По умолчанию

мне нужно именно используя TWebBrowser. NMHTTP не спорю закачивает файл.
Ответить с цитированием
  #4  
Старый 29.01.2009, 20:44
Grosbeak_Coder Grosbeak_Coder вне форума
Прохожий
 
Регистрация: 29.01.2009
Сообщения: 6
Репутация: 10
По умолчанию Именно в Twebbroser

Ну если с имитацией нажатия мыши что-то не клеится, то есть другой вариант. Кнопку можно нажать (если фокус на нее уже установлен) послав с клавиатуры нажатие клавиши "пробел". Выглядит это где-то вот так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var h:  HWND;
begin
h:=  FindWindow('Окно',  nil);  //  ищем  окно  
SendMessage(h,  WM_SYSCOMMAND,  SC_HOTKEY,  h);  //  активизируем  его
Button2.Click;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
keybd_event(32,0,WM_KEYDOWN,0); //Имитируем нажатие клавиши "пробел" на клавиатуре
end;
Admin: Пользуемся тегами!
Ответить с цитированием
  #5  
Старый 29.01.2009, 21:38
alxsev alxsev вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 4
Репутация: 10
По умолчанию

Код HTML:
h2 := FindWindowEx(h1, 0,'Button', '&Сохранить'); SendMessage(h2, WM_SYSCOMMAND, SC_HOTKEY, h2); // активизируем его keybd_event(32,0,WM_KEYDOWN,0); //Имитируем нажатие клавиши "пробел" на клавиатуре keybd_event(32,0,WM_KEYUP,0);

сейчас вижу что кнопка нажата но не отжата.. в итоге действие ее не выполняется
Ответить с цитированием
  #6  
Старый 29.01.2009, 22:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

а если попробовать получить координаты кнопки, навести туда мышь и "кликнуть"?
Ответить с цитированием
  #7  
Старый 30.01.2009, 01:07
Grosbeak_Coder Grosbeak_Coder вне форума
Прохожий
 
Регистрация: 29.01.2009
Сообщения: 6
Репутация: 10
По умолчанию

Ну есть еще такой вариант:

Код:
{keybd_event(32,0,WM_KEYDOWN,0);
keybd_event(32,0,WM_KEYUP,0);}

keybd_event(VK_SPACE, 0, 0 ,0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP,0);
Ответить с цитированием
  #8  
Старый 30.01.2009, 20:15
alxsev alxsev вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 4
Репутация: 10
По умолчанию

вот что мне посоветовали на другом форуме.. все теперь работает
Код:
var h1,h2:hwnd;
begin

  h1:=0;
  h2:=0;

  h1 := FindWindow ('#32770', 'Загрузка файла');
  if h1<> 0 then
  begin

    h2 := FindWindowEx(h1, 0, 'Button', '&Сохранить');
    if (h2<>0) then
    begin
      //Устанавливаем фокус на кнопку и активируем её - автоматом на окно
      SetForegroundWindow(h2);
      SendMessage(h2, WM_ACTIVATE, 1, 0);
      SendMessage(h2, WM_ENABLE, 1, 0);
      SendMessage(h2, WM_SETFOCUS, 1, 0);

      //Переносим фокус на другое окно, чтобы перерисовалось окно IE
      SetForegroundWindow(handle);
      Application.ProcessMessages;
      SetForegroundWindow(h2);
      SendMessage(h2, WM_SETFOCUS, 1, 0);
      Sleep(1000); //Делаем обязательную паузу, чтобы окно успело прорисоваться

      //Посылаем Enter кнопке
      keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
      keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
      keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);

    end;
  end;
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 30.01.2009 в 20:29.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter