Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
1

Владелец буфера обмена

13.02.2015, 16:27. Показов 932. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В MSDN есть такое понятие как "владелец буфера обмена". В его роли выступает окно.
Вопрос: как фигурирует окно в вызове функции для работы с буфером обмена? Насколько я знаю, вызов производит поток и функции известна о нём информация. Как винда определяет какое окно выполнило вызов функций SetClipboardData/GetClipboardData? Проходится по стеку вызовов и определяет есть ли в нём процедура окна?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2015, 16:27
Ответы с готовыми решениями:

Сохранение изображения из буфера обмена
Добрый день. Подскажите, как сохранить изображение, хранящееся в буфере обмена? по статье из MSDN...

Запрет на использования буфера обмена
Задача такова: нужно запустить 4 блокнота (процесса) с запретом использования для них буфера обмена...

Отлавливание вставки из буфера обмена
Необходимо отлавливать вставку из буфера обмена (в любое место). Желательно, чтобы отлов...

Отслеживание изменений буфера обмена (Си)
Приветствую. Есть код на C, который выводит в консоль содержимое буфера обмена (текст или путь к...

13
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
13.02.2015, 22:23 2
Зачем так всё усложнять? При вызове OpenClipboard HWND владельца передается параметром.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 02:35  [ТС] 3
Цитата Сообщение от rao Посмотреть сообщение
При вызове OpenClipboard HWND владельца передается параметром.
Да я знаю, ё-моё. Вопрос не в этом.
0
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
14.02.2015, 10:08 4
А в чем собственно проблема? Что конкретно не работает? Какая разница как в винде это реализовано? Скорее всего при открытии буфера обмена процесс получает в таблицу дескрипторов соответствующий хэндл на объект буфера. А диспетчер объектов в свою очередь соответствующим образом этот буфер лочит.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.02.2015, 11:02 5
Цитата Сообщение от Enno Посмотреть сообщение
Как винда определяет какое окно выполнило вызов функций SetClipboardData/GetClipboardData?
Система запоминает поток, который вызвал OpenClipboard, и переданный HWND, в
специальных внутренних структурах, связанных с оконной станцией (window station).
После, при вызове SetClipboardData/GetClipboardData, нет никакой проблемы
получить обратно данные потока и этот HWND.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 11:07  [ТС] 6
Цитата Сообщение от rao Посмотреть сообщение
процесс получает в таблицу дескрипторов соответствующий хэндл на объект буфера
Тогда получается что владельцем является процесс, а не окно?
Цитата Сообщение от Убежденный Посмотреть сообщение
Система запоминает поток
Тогда получается что владельцем является поток, а не окно?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.02.2015, 11:08 7
Цитата Сообщение от Enno Посмотреть сообщение
Тогда получается что владельцем является поток, а не окно?
Нет. Владельцем остается окно.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 11:11  [ТС] 8
Цитата Сообщение от Убежденный Посмотреть сообщение
Нет. Владельцем остается окно.
А как система определяет что это "окно вызвало функцию" (щито? Окно вызвало функцию?).
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.02.2015, 11:40 9
В терминологии WinAPI, владельцем clipboard-а является окно.
Система посылает владельцу оконные сообщений, когда определенные события
происходят, например WM_DRAWCLIPBOARD или WM_DESTROYCLIPBOARD.
Поток, который вызывает OpenClipboard, указывает HWND окна, которое
он хочет сделать новым владельцем clipboard-а. У потока, кстати, может быть
много созданных окон, иначе в параметре HWND вообще не было бы нужды.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 15:49  [ТС] 10
WM_DRAWCLIPBOARD посылается viewer'у. (Only clipboard viewer windows receive this message.)
Цитата Сообщение от Убежденный Посмотреть сообщение
У потока, кстати, может быть
много созданных окон, иначе в параметре HWND вообще не было бы нужды.
Вот именно поэтому я и начал тему. Хотя можно ведь наверняка указать hwnd окна другого потока (в MSDN ни слова).
Что в итоге: владелец - окно, но только для получения сообщений, а Set/GetCBData можно отправлять "из любого места" потока-владельца окна "владельца буфера".
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.02.2015, 17:07 11
Цитата Сообщение от Enno Посмотреть сообщение
Вот именно поэтому я и начал тему. Хотя можно ведь наверняка указать hwnd окна другого потока (в MSDN ни слова).
Что в итоге: владелец - окно, но только для получения сообщений, а Set/GetCBData можно отправлять "из любого места" потока-владельца окна "владельца буфера".
Можно, только работать это не будет.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 17:13  [ТС] 12
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно, только работать это не будет.
Откуда инфа?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.02.2015, 17:21 13
Цитата Сообщение от Enno Посмотреть сообщение
Откуда инфа?
Проверяется за 5 минут в Visual C++.


Да тут и проверять особо нечего, смотри:

1. Поток A делает OpenClipboard, передавая HWND окна, которое
было создано потоком B. Система запоминает TID потока и HWND
окна во внутренней структуре.

2. Поток B вызывает, к примеру, EmptyClipboard.
Теперь система должна определить владельца, но во внутренних
структурах, связанных с буфером обмена, записан поток A, а не B.
Короче, lookup по TID/HANDLE потока B не дает результатов.

3. Fail.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.02.2015, 18:13  [ТС] 14
Ну, тут ещё действует предохранитель от "подкидыша". Пока CloseClipboard не вызовешь - другие пользоваться не смогут. А если подкинуть права на CB тому кто не собирался с буфером работать, то можно буфер повесить.
0
14.02.2015, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 18:13
Помогаю со студенческими работами здесь

Отслеживание вставки из буфера обмена
Необходимо отследить, а точнее перехватить вставку из буфера обмена. Я сделал хук вида...

Содержимое из буфера обмена в переменную
Привет, как узнать содержимое буфера, чтоб временно сохранить это в переменую ?

Получение содержимого буфера обмена
Добрый день. Подскажите пожалуйста, как извлечь текст из буфера обмена средствами WinAPI?

Вывести на экран картинку из буфера обмена
Здравствуйте, помогите пожалуйста. Мне нужно вывести картинку из буфера обмена. if...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru