Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Evg
Эксперт CАвтор FAQ
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,595
Записей в блоге: 30
1

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

28.01.2011, 13:34. Показов 2793. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2011, 13:34
Ответы с готовыми решениями:

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

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

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

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

11
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
28.01.2011, 18:10 2
Цитата Сообщение от 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
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2011, 18:35 3
я с clipboardом работал через более новые функции OleSetClipboard, OleFlushClipboard, OleGetClipboard
там подход пожалуй много другой

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

Цитата Сообщение от alex_x_x Посмотреть сообщение
вы храните данные для обмена в глобальной памяти
Что такое "глобальная память"?
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2011, 22:45 5
Evg, звучит плохо, пускай память доступная вне процесса, ну понятно о чем речь
0
Evg
Эксперт CАвтор FAQ
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,595
Записей в блоге: 30
29.01.2011, 12:23  [ТС] 6
alex_x_x, имеется в виду нечто, являющееся разделяемой между процессами памятью?
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 15:55 7
я тут нагуглил, вообщем не так как я ожидал
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
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,595
Записей в блоге: 30
29.01.2011, 16:36  [ТС] 8
Ладно... будем считать, что это некая магическая хрень, которая должна быть. Но мне не совсем понятно, нафига
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 16:59 9
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
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,595
Записей в блоге: 30
29.01.2011, 19:57  [ТС] 10
Цитата Сообщение от alex_x_x Посмотреть сообщение
выделяем память из глобальной кучи(это все архаизмы винды)
Так чем оно принципиально от malloc'а отличается?

Цитата Сообщение от alex_x_x Посмотреть сообщение
блокируем ее
Зачем и от кого?
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.01.2011, 20:02 11
Evg, так ответ - так винда придумала, эта схема работы старое старье, ну вот буфер обмена только с такой памятью и так работает
0
Evg
Эксперт CАвтор FAQ
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,595
Записей в блоге: 30
30.01.2011, 12:53  [ТС] 12
Я толком так нифига и не понял, кроме того, что надо делать так и воспринимать это как данность. Меньше знаешь - лучше спишь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2011, 12:53

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

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

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

Работа с буфером обмена
Как сделать копирование выделенного объекта в буфер windows и вставку из буфера объекта (или просто...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru