Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
RAD XE4+

Автоматическая прокрутка страницы вниз (CppWebBrowser)

15.03.2019, 01:47. Показов 3683. Ответов 3

Студворк — интернет-сервис помощи студентам
Суть следующая: делаю программу (поиск друзей / людей вконтакте).
Интерфейс: используя CppWebBrowser, пользователь заходит на страницу https://vk.com/friends?act=find либо https://m.vk.com/search?c%5Bsection%5D=people (мобильная версия). Выбирает несколько фильтров, на выходе получает некоторые данные (список).
Далее (с помощью API) программа из этого списка извлекает ID людей "вконтакта".



Проблема в том, что выдача API отличается от выдачи браузера (результатов меньше) либо я не совсем разобрался в структуре запросов и иногда через API вообще ничего не выдается (на других компьютерах под Win 7 64; у меня Win 7 32, если это имеет значение).
И я решил сделать "ход конем" (точнее, заняться "велосипедокостылестроением").
Пользователь, как обычно, заходит на страницу, выбирает фильтры. Когда данных достаточно много, страница сразу вся не прогружается, приходится ее прокручивать до самого низа.
Я попытался сделать так, чтобы страница автоматически прокручивалась вниз. Попытки ниже, ничего не получилось.
WB - это CppWebBrowser.
Прогрузка данных должна происходить при полном открытии страницы в браузере (OnDocumentComplete):
C++
1
void __fastcall TForm1::WBDocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL)
Пытался сделать так:
C++
1
  PostMessage(WB->Handle, WM_VSCROLL, SB_BOTTOM, 0);
так:
C++
1
  ScrollWindowEx(WB->Handle, 0, 100, NULL, NULL, NULL, NULL, SW_SMOOTHSCROLL);
и даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  return h2;
}
 
//.............
 
  // по данным программы типа winspy
  HWND hWnd = FindWindow(L"TForm1", L"Расширенный поиск друзей VK");
  HWND hWnd2 = NextWindowElement(hWnd, L"Shell Embedding", NULL, 1);
 
  // тут уже хэндл hWnd3 не определяется, хотя элементы идут именно в таком порядке
  HWND hWnd3 = NextWindowElement(hWnd2, L"Shell DocObject View", NULL, 1);
  HWND hWnd4 = NextWindowElement(hWnd3, L"Internet Explorer_Server", NULL, 1);
 
  // нулевые значения тоже пробовал, но до сюда и не доходит ввиду проблемы с хэндлом выше
  PostMessage(hWnd4, WM_KEYDOWN, VK_END, 0xc14f0001);
  PostMessage(hWnd4, WM_KEYUP, VK_END, 0xc14f0001);
  // либо
  PostMessage(hWnd4, WM_VSCROLL, SB_BOTTOM, 0);






Результат нулевой.

P.S.: насколько понимаю, принципиальной разницы между CppWebBrowser и WebBrowser нет?
Знаю, что IE устарел во всех смыслах и нормальные люди используют компонент на основе Chromium, но в нем тоже нужно еще разобраться.
P.S.S.: всё, что нужно прописать в реестре для "эмуляции" IE 11, сделано, к тому же вручную или кнопками страница (у меня по крайней мере) прокручивается.

0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2019, 01:47
Ответы с готовыми решениями:

Автоматическая прокрутка вниз блока
привет всем))) помогите кто знает или догадывается! у меня есть div, в котором списком размещаются ссылки на статьи, этот блок имеет...

Автоматическая прокрутка в начало страницы
Есть такое дело - ссылки, которые выводят диалоговое окно, находятся в середине страницы, но при нажатии на одну из ссылок переехало в...

Срабатывает автоматическая прокрутка вверх страницы
Добрый день! Подскажите скрипт, что-бы при переходе на другие страницы, не срабатывала автоматическая прокрутка в начало страницы? ...

3
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
15.03.2019, 02:46  [ТС]
Забыл сказать, что "прогрузка" (прокрутка) страницы нужна для того, чтобы потом получить сразу все данные из браузера без использования API вконтакта.
И еще один скриншот касаемо win spy:



P.S.: на компьютере установлен, в частности, браузер IE 11-ой версии.
0
65 / 31 / 18
Регистрация: 16.03.2019
Сообщений: 84
17.03.2019, 11:20
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

Здравствуйте.

Для того, чтобы прокрутить страницу необходимо найти "нужное" окно Internet Explorer.
Предполагаю, что это можно сделать через объектную модель браузера (но не уверен).
Для меня проще найти окно через Win API.
Ищем треубемое дочернее окно браузера, через имя класса окна:

Заголовок формы *.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TCppWebBrowser *WB;
...
    void __fastcall WBDocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL);
...
private:    // User declarations
    static HWND FIEWnd;  // Хэндл найденного окна
    static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
....
};
Код файла формы *.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
TForm1 *Form1;
 
HWND TForm1::FIEWnd = NULL;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
...
 
//---------------------------------------------------------------------------
void __fastcall TForm1::WBDocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL)
{
    FIEWnd = NULL;
 
    EnumChildWindows(WB->Handle, TForm1::EnumWindowsProc, NULL);
 
    if (FIEWnd == NULL || FIEWnd == INVALID_HANDLE_VALUE)
    {
        UnicodeString uCaption = L"Ошибка";
        UnicodeString uText = L"Окно Internet Exporer не найдено";
        Application->MessageBoxW(uText.w_str(), uCaption.w_str(), MB_OK | MB_ICONERROR);
        return;
    }
 
    PostMessage( FIEWnd, WM_VSCROLL, SB_BOTTOM, 0);
}
//---------------------------------------------------------------------------
BOOL CALLBACK TForm1::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    // Можно оставить только часть имени класса окна
    static const UnicodeString uSubStrCl = L"Internet Explorer_Server";
 
    wchar_t lpClassName[256];
 
    if (GetClassName(hWnd, lpClassName, 255))
    {
        const UnicodeString uClassName = lpClassName;
        if (uClassName.Pos(uSubStrCl))
        {
            TForm1::FIEWnd = hWnd;
            return false;   // Заканчиваем перебор окон
        }
    }
    return true; // Продолжаем перебор окон, если они есть
}
//---------------------------------------------------------------------------
Предполагаю, что в разных версиях IE имя класса окна может немного отличаться,
поэтому для поиска нужно оставить ту часть имени, которая всегда одинакова.
Например так:
C++
1
2
3
4
5
6
BOOL CALLBACK TForm1::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
...
    static const UnicodeString uSubStrCl = L"Internet Explorer";
...
}
Как-то так...
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
18.03.2019, 21:07  [ТС]
Премного благодарен. То, что нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2019, 21:07
Помогаю со студенческими работами здесь

Прокрутка вниз страницы до определенной точки или по координатам
Подскажите какую то функцию Scrolling без разницы прокрутка до точки в низ страницы или по координатам. Не использую javascript.

Прокрутка вниз!!!
Как мне сделать чтобы страница при её загруске пракрутилась в самый низ?

Прокрутка вниз на ноутбуке
Здравствуйте, нужна помощь, может кто сталкивался с таким уже. Проблема в прокрутке вниз на ноутбуке, всего-приложений, документов,...

Прокрутка вниз и aircrack
Всем привет! Столкнулся с проблемой, про которую нигде ничего не написано! Запускаю aircrack, он мне выводит в терминал очень...

Мягкая прокрутка вниз
Имеется такая строчка. if (document.documentElement.clientWidth &lt; 450) window.scrollTo(0,680); хотелось бы мягкую прокрутку до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru