Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30

Просьба сделать некоторые пояснения по поводу работы с буфером обмена

28.01.2011, 13:34. Показов 3367. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно скопировать текст в буфер обмена (clipboard). За основу взял сию документацию http://msdn.microsoft.com/en-u... s.85).aspx раздел "Copying Information to the Clipboard".

Насколько я понимаю, схематично принцип работы в моём случае такой:

C
1
2
3
4
5
OpenClipboard
EmptyClipboard
hglbCopy = какая-то шайтан-арба
SetClipboardData(CF_TEXT, hglbCopy)
CloseClipboard
Есть два вопроса

1. Параметр OpenClipboard'а описывается так: "A handle to the window to be associated with the open clipboard. If this parameter is NULL, the open clipboard is associated with the current task.". Что значит "to be associated with the open clipboard"? Я знаю, как это перевести на русский, но не понимаю визический смысл, вкладываемый в "ассоциированный"

2. Я так понимаю, что данные в буффер подаются в некотором абстрактном формате (т.е. в буффер помещаются данные + описание, что из себя данные представляют). В нашем случае шайтан-арба выглядит как (скопировал код без изменений):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        // Allocate a global memory object for the text. 
 
        hglbCopy = GlobalAlloc(GMEM_MOVEABLE, 
            (cch + 1) * sizeof(TCHAR)); 
        if (hglbCopy == NULL) 
        { 
            CloseClipboard(); 
            return FALSE; 
        } 
 
        // Lock the handle and copy the text to the buffer. 
 
        lptstrCopy = GlobalLock(hglbCopy); 
        memcpy(lptstrCopy, &pbox->atchLabel[ich1], 
            cch * sizeof(TCHAR)); 
        lptstrCopy[cch] = (TCHAR) 0;    // null character 
        GlobalUnlock(hglbCopy);
Хотелось бы так же узнать физический смысл данных деяний. Не надо отсылать меня к документации, потому как документацию на каждый интерфейс по отдельности прочитал, но великой концепции так и не понял
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2011, 13:34
Ответы с готовыми решениями:

Аналог работы с буфером обмена
Дело в том чтоя я пишу простую программу в которой мне нужно использовать клипбоард, и когда я прописываю в проекте: Uses...

Дан текстовый файл,содержащий некоторые пояснения,заключенные в скобки. Убрать эти пояснения вместе со скобками
Дан текстовый файл,содержащий некоторые пояснения,заключенные в скобки. Убрать эти пояснения вместе со скобками. Выровнять ...

Пояснения по поводу dpi
Я заказал себе мышку с с четырьмя режимами dpi. От 800 до 2500. На сколько я знаю, dpi влияет на точность мыши. Тогда, зачем там...

11
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
28.01.2011, 18:10
Цитата Сообщение от Evg Посмотреть сообщение
Что значит "to be associated with the open clipboard"?
Это значит то, что клиборд будет ассоциирован с окном, либо с текущей задачей если NULL.
если клиборд связываеш с окном то появется возможность отслеживать его изменения.
т.е. в оконую функцию будут приходить сообщения (WM_DESTROYCLIPBOARD,WM_RENDERFORMAT...)
их там с десяток. При необходимости можно их обработать.

Цитата Сообщение от Evg Посмотреть сообщение
какая-то шайтан-арба
Хандл глобального объекта памяти(GlobalAlloc). Для клиборда флаг такой GMEM_MOVEABLE

Объясняло с меня ни куда не годится, вот тебе мой рабочий код. там все придельно ясно.
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
BOOL clipboard_copy(const char *text)
{
    void *ptext;
    HGLOBAL hglob;
    unsigned length;
 
    if (!text || !(length = strlen(text)))
        return FALSE;
 
    length++;
    if (!(hglob = GlobalAlloc(GMEM_MOVEABLE, (DWORD)length)) ||
        !(ptext = GlobalLock(hglob))) {
        //error_handle(GetLastError());
        return FALSE;
    }
 
    memcpy(ptext, (void*)text, length);
    GlobalUnlock(hglob);
 
    if (OpenClipboard(NULL)) { // У меня нет нужды отслеживать изменения, hWndNewOwner = NULL
        EmptyClipboard();
        SetClipboardData(CF_TEXT, hglob);
        CloseClipboard();
    } else {
        //error_handle(GetLastError());
        return FALSE;
    }
 
    return TRUE;
}
 
// 
clipboard_copy("Test Clipboard");
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2011, 18:35
я с clipboardом работал через более новые функции OleSetClipboard, OleFlushClipboard, OleGetClipboard
там подход пожалуй много другой

Цитата Сообщение от Evg Посмотреть сообщение
2. Я так понимаю, что данные в буффер подаются в некотором абстрактном формате (т.е. в буффер помещаются данные + описание, что из себя данные представляют). В нашем случае шайтан-арба выглядит как (скопировал код без изменений):
не знаю какова идея в старом олевском подходе, но в новом:
есть clipboard'овское api (не совсем так, там есть IDataObject объект обмена между процессами с ним и производят действия), которое сообщает системе, что у нее есть данные такого-то формата (CF_TEXT например, их может быть к тому же одновременно несколько, например и ascii и unicode текст храним) и для каждого из форматов способ их хранения(для каждого формата подразумевается возможность иметь свои данные и свой способ хранения), это позволяет определить другому приложениею как эти данные вытянуть (в вашем случае используется GlobalAlloc - вы храните данные для обмена в глобальной памяти, как минимум в новой модели подразумевается некоторое число других, вплоть до обмена через файлы )
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.01.2011, 22:15  [ТС]
Цитата Сообщение от bobrovskii Посмотреть сообщение
вот тебе мой рабочий код. там все придельно ясно
Я и сам написал рабочий код, только не понимаю, как конкретно он работает

Цитата Сообщение от alex_x_x Посмотреть сообщение
вы храните данные для обмена в глобальной памяти
Что такое "глобальная память"?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2011, 22:45
Evg, звучит плохо, пускай память доступная вне процесса, ну понятно о чем речь
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.01.2011, 12:23  [ТС]
alex_x_x, имеется в виду нечто, являющееся разделяемой между процессами памятью?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 15:55
я тут нагуглил, вообщем не так как я ожидал
This won't work. GlobalAlloc can't be used to share memory between
processes in Win32. It's effectively a legacy function. It was used in
Win16 days to share memory, but it's pretty much only used for some
legacy needs like DDE, the clipboard, and OLE data objects.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.01.2011, 16:36  [ТС]
Ладно... будем считать, что это некая магическая хрень, которая должна быть. Но мне не совсем понятно, нафига
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 16:59
Evg, так что именно?

Цитата Сообщение от Evg Посмотреть сообщение
hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
(cch + 1) * sizeof(TCHAR));
выделяем память из глобальной кучи(это все архаизмы винды)
Цитата Сообщение от Evg Посмотреть сообщение
lptstrCopy = GlobalLock(hglbCopy);
блокируем ее, нам дают указатель на выделенную память, размером не меньше затребованного
потом копируем туда наши данные, разлочиваем обратно

Цитата Сообщение от Evg Посмотреть сообщение
SetClipboardData(CF_TEXT, hglbCopy)
помечаем эти данные форматом (видимо в таком подходе возможен только один формат), конечное приложение узнает, что в буфере лежат данные текстового формата, и получит handle, применит GlobalLock и получит данные из буфера

Цитата Сообщение от Evg Посмотреть сообщение
1. Параметр OpenClipboard'а описывается так: "A handle to the window to be associated with the open clipboard. If this parameter is NULL, the open clipboard is associated with the current task.". Что значит "to be associated with the open clipboard"? Я знаю, как это перевести на русский, но не понимаю визический смысл, вкладываемый в "ассоциированный"
не знаю наверняка, но например drag&drop в винде реализуется через буфер обмена, D&D определенно связан с окнами того куда и откуда, видимо поэтому буферное api завязано на окнах
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.01.2011, 19:57  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
выделяем память из глобальной кучи(это все архаизмы винды)
Так чем оно принципиально от malloc'а отличается?

Цитата Сообщение от alex_x_x Посмотреть сообщение
блокируем ее
Зачем и от кого?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 20:02
Evg, так ответ - так винда придумала, эта схема работы старое старье, ну вот буфер обмена только с такой памятью и так работает
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.01.2011, 12:53  [ТС]
Я толком так нифига и не понял, кроме того, что надо делать так и воспринимать это как данность. Меньше знаешь - лучше спишь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2011, 12:53
Помогаю со студенческими работами здесь

Нужны некоторые пояснения
При выполнении программы есть область 20 на 20. 1) Почему при движении вправо или влево, после того, как заканчивается строчка, курсор...

Работа с буфером обмена
В общем нужна программа, которая по клавише активации(например F10) считывала кол-во символов в буфере обмена и заменяла их другими...

Работа с буфером обмена
Всем привет .. Помогите пожалуйста ... Работаю на QT под Линукс ... Как мне записать информацию в буфер обмена, а потом ее считать ......

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru