Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Работа с буфером обмена средствами WinAPI |
Автор: lollollollol 27.3.2013, 10:34 | ||||||
Здравствуйте. Есть задача - Сделать скриншот экрана. Условие - Текстовое значение буфера обмена должно остаться неизменным. Я решил сделать так:
Если добавить uses clipbrd, то решение задачи не занимает больше пяти минут. Но необходимо сделать это использую лишь uses windows. Пытался получить текст так:
Прошу помочь с вопросом, спасибо Добавлено @ 10:45 Заглянул в USES, выдрал оттуда код
Но к моему удивлению Data=0. Видимо нельзя передавать GetCurrentProcess. А как можно получить хендл процесса, без формы? |
Автор: Akella 27.3.2013, 12:56 |
Нужно обязательно через winapi? |
Автор: Evjeny 27.3.2013, 13:06 | ||
CF_TEXT - кодировка ANSI, каждая строка заканчивается CRLF, в конце буфера 0 по поводу OpenClipboard - исходя из документации надо передавать 0:
|
Автор: lollollollol 27.3.2013, 18:29 | ||||
Обязательно без использования любых uses кроме windows
Да, вот это я стормозил. Передал ноль, и смог получить текст из буфера Посмотрев повнимательней Clipbrd, удалось и записать текст в буфер Остался финальный вопрос, как записать скриншот, который находится в буфере в переменные buff: array[0..20971520] of byte; //Массив байт buff_size:integer; //Размер изображения Может получить указатель на адрес памяти, а потом просто скопировать, но для этого нужно размер знать, да и как быть с типом данных? |
Автор: Evjeny 27.3.2013, 20:25 |
Я в делфи не силен - CopyScreenToClipboard это функция делфи или самописаная? как вариант узнать формат содержимого буфера обмена (GetClipboardFormatName), и уже от этого отталкиваться - найти описание формата и т.д. |
Автор: lollollollol 27.3.2013, 20:59 | ||
Должно быть изображение BitMap, всё что есть для этого типа расчитано что я загружу его в TBitmap, но мне нельзя использовать это. |
Автор: Evjeny 27.3.2013, 21:21 |
да это HBITMAP, соответственно и работать с ним можно через win api... http://www.sql.ru/forum/actualthread.aspx?tid=885895 пример (правда на с++), как сохранить это все в файл.... |
Автор: lollollollol 27.3.2013, 21:47 | ||
А если за основу взять функцию которая копирует текст:
Я верно мыслю? Указываю необходимый тип, теперь осталось получить информацию. Но не пойму как в массив записать BitMap, который сейчас в буфере |
Автор: Evjeny 27.3.2013, 22:33 |
нет так не получится...картинка хранится в буфере в определенном формате (http://ru.wikipedia.org/wiki/BMP в данном случае), т.е. чтобы вычислить тот же размер, необходимо обращаться к полям заголовка файла... думаю в сети можно найти примеры работы с bmp форматом, на делфи в том числе...на крайний случай можно почитать описание формата и написать самому... я бы помог кодом, но с делфи давно не общался, да и иде самой нету... |
Автор: lollollollol 28.3.2013, 07:04 |
В любом случае это просто набор байт, нужно знать лишь начало, и размер. Так что думаю получится. BMP это ведь просто формат где каждый пиксель это цвет, в формате RGP и занимает он 3 байта. Значит размер изображения должен быть Длина*Ширина*3. Хотя сомневаюсь, ведь в начале .bmp файла есть ряд символов которые уникальны для каждого формата |
Автор: lollollollol 28.3.2013, 09:45 | ||
|
Автор: lollollollol 28.3.2013, 20:44 | ||
После res:=GlobalLock(Data); показало Неверный дескриптор окна, непойму что ему не нравится, остальные функции без ошибок отработали, проверил этим же кодом |