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

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

28.02.2019, 20:47. Показов 2592. Ответов 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
9929 / 6466 / 2457
Регистрация: 21.01.2014
Сообщений: 27,422
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru