Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 04.10.2018
Сообщений: 7

Работа с буфером С++ Builder

28.02.2019, 20:47. Показов 2559. Ответов 9

Студворк — интернет-сервис помощи студентам
Задача состоит в следующем: запускаю свою программу на которой есть Memo. Затем открываю различные сайты в браузере, там выделяю какой-либо текст на странице и необходимо, чтобы по нажатию горячих клавиш (например Ctrl+q) выделенный текст из браузера скопировался в Memo моего приложения. Помогите с реализацией копирования, никак не могу сделать!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2019, 20:47
Ответы с готовыми решениями:

Работа с буфером...
Как на VC++ считывать содержание буфера (текст, а не файл)? Как отследить изменение его содержания???

Работа с буфером
Добрый день, требуется исправить программу. Суть программы - имитирует ручной ввод информации из буфера обмена. Присутствует ошибка -...

Работа с z-буфером
Как считать матрицу пикселей глубины каждой точки (вроде бы она хранится в буфере глубины)?

9
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
28.02.2019, 21:31
Цитата Сообщение от iamsia Посмотреть сообщение
чтобы по нажатию горячих клавиш
А чем Вам старые добрые Ctrl + C и Ctrl + V не угодили?
0
0 / 0 / 0
Регистрация: 04.10.2018
Сообщений: 7
28.02.2019, 21:44  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
А чем Вам старые добрые Ctrl + C и Ctrl + V не угодили?
В таком случае придется постоянно переходить между окнами браузера и программы, а это в данной задаче не очень удобно. Требуется, чтобы она сама заполняла Memo через комбинации клавиш, не отвлекая внимание пользователя от браузера.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.03.2019, 00:01
То есть, то, что Ctrl+Q в Firefox-е - это закрытие текущего окна, это ничего? А другая комбинация клавиш - может что-то делать в другом браузере, их там сотни навешаны... Почему должен выполняться код какого-то стороннего приложения, если у браузера есть свой hotkey? А стало быть, переключаться на другое окно все равно придется. И тут опять возникает вопрос: почему в таком случае не Ctrl+V?
0
0 / 0 / 0
Регистрация: 04.10.2018
Сообщений: 7
01.03.2019, 01:20  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
То есть, то, что Ctrl+Q в Firefox-е - это закрытие текущего окна, это ничего? А другая комбинация клавиш - может что-то делать в другом браузере, их там сотни навешаны... Почему должен выполняться код какого-то стороннего приложения, если у браузера есть свой hotkey? А стало быть, переключаться на другое окно все равно придется. И тут опять возникает вопрос: почему в таком случае не Ctrl+V?
Работаю в хром, там комбинация Ctrl+q свободна, да и вообще она приведена лишь для примера, это не суть вопроса. Я должен быть на заданной странице и быстро посылать в прогу выделенные куски текста и вместо того, чтобы по сто раз переключаться между окнами, клацать в мемо и вставлять туда вручную, гораздо удобнее сделать это все лишь одной комбинацией. К тому же я видел подобные реализации и как они работают, потому и пытаюсь сделать аналог.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
01.03.2019, 10:03
Лучший ответ Сообщение было отмечено iamsia как решение

Решение

RegisterHotKey. Как сделать несколько RegisterHotKey и отменить регистрацию
Сделать горячии клавиши для игры

Насчет "наших действий":
так как текст выделен, то копируем его, например, так (имитация нажатия Ctrl+C)
(можно еще, полагаю, попробовать копировать с помощью виндовых сообщений SendMessage / PostMessage с параметром WM_COPY)
C++
1
2
3
4
5
6
7
8
9
10
11
  //нажали и удерживаем Ctrl
  keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
 
  //нажимаем клавишу C
  keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  keybd_event(67, 0, KEYEVENTF_EXTENDEDKEY, 0);
 
  //отпускаем клавиши
  keybd_event(67, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
  keybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
Добавление текста в Memo:
C++
1
2
3
4
5
// не забудь "подключить" работу с буфером
  #include <Clipbrd.hpp>
 
  if (Clipboard()->HasFormat(CF_TEXT))  // если в буфере текст
    Memo1->Lines->Add(Clipboard()->AsText);
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.03.2019, 12:25
gunslinger, это лишнее. Не надо никуда уходить от Ctrl+C. Как только пользователь что-то выделил и нажал на Ctrl+c, текст, разумеется, ушел в буфер обмена. А если настроить SetClipboardViewer, то все, что останется пользовательской программе - это поймать WM_DRAWCLIPBOARD, и вытащить текст из буфера обмена при его получении. Всё...

Примеры установки наблюдателя за ящиком на форуме были, я сам приводил, если что.
1
0 / 0 / 0
Регистрация: 04.10.2018
Сообщений: 7
01.03.2019, 20:35  [ТС]
gunslinger, Да, это именно то, что я и хотел увидеть!! Правда он почему то в мемо отправляет предыдущий текст, который был в буфере, но я думаю это поправимо.
Cпасибо большое за помощь)))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 12
01.03.2019, 21:22
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

Как всегда, выбираем не то, что нужно, и вертим очередного монстра. Ну-ну. Удачи...

Кликните здесь для просмотра всего текста
А на самом деле задача решается так: в класс формы добавляем вот такой приватный раздел:
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
private:
    HWND FNextCbViewer;
    void __fastcall WMChangeCBChain(TWMChangeCBChain &Msg)
    {
        Msg.Result = 0;
        if(Msg.Remove == FNextCbViewer)
        {
            FNextCbViewer = Msg.Next;
        }
        else
        {   // Информируем дальше по цепочке о событии изменении цепочки
            ::SendMessage(FNextCbViewer, WM_CHANGECBCHAIN, WPARAM(Msg.Remove), LPARAM(Msg.Next));
        }
    }
    void __fastcall WMDrawClipboard(TWMDrawClipboard &Msg)
    {
        try
        {   // Собственно, уведомление пользователя. Тут можно делать с Clipboard-ом все что нужно
            Memo1->Lines->Add(Clipboard()->AsText);
        }
        __finally
        {   // Но в конце информируем следующего в цепочке об изменении буфера
            ::SendMessage(FNextCbViewer, WM_DRAWCLIPBOARD, WPARAM(0), LPARAM(0));
        }
    }
 
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_CHANGECBCHAIN, TWMChangeCBChain, WMChangeCBChain)
        VCL_MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TWMDrawClipboard, WMDrawClipboard)
    END_MESSAGE_MAP(TForm)
, и в OnCreate/OnDestroy формы соответственно добавляем/убираем слежение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    FNextCbViewer = ::SetClipboardViewer(this->Handle);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    if(FNextCbViewer)
    {
        ::ChangeClipboardChain(this->Handle, FNextCbViewer);
        FNextCbViewer = 0;
    }
}
, и все прекрасно работает... безо всяких keybd_event и ему подобной лабуды. Любым удобным образом скопировал текст (может, мне удобнее не Ctrl+C, а правой кнопкой мыши и выбирать пункт меню) - он появился в Memo...
1
0 / 0 / 0
Регистрация: 04.10.2018
Сообщений: 7
01.03.2019, 21:44  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Как всегда, выбираем не то, что нужно, и вертим очередного монстра. Ну-ну. Удачи...
Дело в том, что не все, из того что надо скопировать, необходимо отправлять в программу. Сtrl+c будет использоваться по ее прямому назначению. А иная комбинация, будет копировать и сразу пересылать текст в программу. А в предложенном вами варианте, будет получаться так, что любой текст который мы захотим скопировать, программа будет отлавливать, но нам это не нужно. Именно этим обосновывается введение второй комбинации.

PS
Ответ, который я получил, меня полностью устраивает, поэтому не вижу смысла продолжать полемику по данной теме.
Всем добра!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2019, 21:44
Помогаю со студенческими работами здесь

Работа с буфером
Привет! ищу в буфере текст при котором надо вывести сообщение,но проблема в том то что могут быть много вариантов и писать под каждый...

Работа с буфером обмена
Как сделать копирование выделенного объекта в буфер windows и вставку из буфера объекта (или просто эмуляцию ctrl+c и ctrl+v) через макрос...

Работа с буфером обмена
Народ! помогите пожалуйста найти человека который очень хорошо разбирается с Буфером Обмена! нужно срочно разобраться с этим кодом: ...

Работа с буфером обмена
Добрый вечер. Непонятные вещи творятся с Clipboard, Создаю файл, копирую его в Нное место (Рабочий стол допустим), копирую уже...

Работа с буфером обмена
Подскажите. Есть ли возможность реализовать следующее: Файлы пдф, тиф, джипе хранятся в базе в виде ссылок. Добавление реализовано на...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru