1 | |
Владелец буфера обмена13.02.2015, 16:27. Показов 932. Ответов 13
Метки нет (Все метки)
В MSDN есть такое понятие как "владелец буфера обмена". В его роли выступает окно.
Вопрос: как фигурирует окно в вызове функции для работы с буфером обмена? Насколько я знаю, вызов производит поток и функции известна о нём информация. Как винда определяет какое окно выполнило вызов функций SetClipboardData/GetClipboardData? Проходится по стеку вызовов и определяет есть ли в нём процедура окна?
0
|
13.02.2015, 16:27 | |
Ответы с готовыми решениями:
13
Сохранение изображения из буфера обмена Запрет на использования буфера обмена Отлавливание вставки из буфера обмена Отслеживание изменений буфера обмена (Си) |
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
|
|
13.02.2015, 22:23 | 2 |
Зачем так всё усложнять? При вызове OpenClipboard HWND владельца передается параметром.
0
|
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
|
|
14.02.2015, 10:08 | 4 |
А в чем собственно проблема? Что конкретно не работает? Какая разница как в винде это реализовано? Скорее всего при открытии буфера обмена процесс получает в таблицу дескрипторов соответствующий хэндл на объект буфера. А диспетчер объектов в свою очередь соответствующим образом этот буфер лочит.
0
|
Ушел с форума
|
|
14.02.2015, 11:02 | 5 |
Система запоминает поток, который вызвал OpenClipboard, и переданный HWND, в
специальных внутренних структурах, связанных с оконной станцией (window station). После, при вызове SetClipboardData/GetClipboardData, нет никакой проблемы получить обратно данные потока и этот HWND.
1
|
Ушел с форума
|
|
14.02.2015, 11:08 | 7 |
0
|
Ушел с форума
|
|
14.02.2015, 11:40 | 9 |
В терминологии WinAPI, владельцем clipboard-а является окно.
Система посылает владельцу оконные сообщений, когда определенные события происходят, например WM_DRAWCLIPBOARD или WM_DESTROYCLIPBOARD. Поток, который вызывает OpenClipboard, указывает HWND окна, которое он хочет сделать новым владельцем clipboard-а. У потока, кстати, может быть много созданных окон, иначе в параметре HWND вообще не было бы нужды.
1
|
14.02.2015, 15:49 [ТС] | 10 |
WM_DRAWCLIPBOARD посылается viewer'у. (Only clipboard viewer windows receive this message.)
Вот именно поэтому я и начал тему. Хотя можно ведь наверняка указать hwnd окна другого потока (в MSDN ни слова). Что в итоге: владелец - окно, но только для получения сообщений, а Set/GetCBData можно отправлять "из любого места" потока-владельца окна "владельца буфера".
0
|
Ушел с форума
|
|
14.02.2015, 17:07 | 11 |
0
|
Ушел с форума
|
|
14.02.2015, 17:21 | 13 |
Проверяется за 5 минут в Visual C++.
Да тут и проверять особо нечего, смотри: 1. Поток A делает OpenClipboard, передавая HWND окна, которое было создано потоком B. Система запоминает TID потока и HWND окна во внутренней структуре. 2. Поток B вызывает, к примеру, EmptyClipboard. Теперь система должна определить владельца, но во внутренних структурах, связанных с буфером обмена, записан поток A, а не B. Короче, lookup по TID/HANDLE потока B не дает результатов. 3. Fail.
1
|
14.02.2015, 18:13 [ТС] | 14 |
Ну, тут ещё действует предохранитель от "подкидыша". Пока CloseClipboard не вызовешь - другие пользоваться не смогут. А если подкинуть права на CB тому кто не собирался с буфером работать, то можно буфер повесить.
0
|
14.02.2015, 18:13 | |
14.02.2015, 18:13 | |
Помогаю со студенческими работами здесь
14
Отслеживание вставки из буфера обмена Содержимое из буфера обмена в переменную Получение содержимого буфера обмена Вывести на экран картинку из буфера обмена Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |