OberonCore
https://forum.oberoncore.ru/

Буфер обмена
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6591
Страница 1 из 1

Автор:  Александр К [ Четверг, 26 Март, 2020 13:47 ]
Заголовок сообщения:  Буфер обмена

Как извлечь текст из буфера обмена? В сети нашёл, что надо сначала открыть (WinApi.OpenClipboard (0);) затем получить адрес дескриптора для конкретного типа данных, хранящиеся в буфере (des := WinApi.GetClipboardData (WinApi.CF_TEXT);), затем зачем-то зафиксировать эти данные (desLock := WinApi.GlobalLock (des);). Как дальше подключиться к данным по этому дескриптору не знаю.

Нашёл что после этого надо в обратном порядке: WinApi.GlobalUnlock (des); WinApi.CloseClipboard ();.

Автор:  Александр Ильин [ Четверг, 26 Март, 2020 17:20 ]
Заголовок сообщения:  Re: Буфер обмена

Александр К писал(а):
Как извлечь текст из буфера обмена? В сети нашёл, что надо сначала открыть (WinApi.OpenClipboard (0);) затем получить адрес дескриптора для конкретного типа данных, хранящиеся в буфере (des := WinApi.GetClipboardData (WinApi.CF_TEXT);), затем зачем-то зафиксировать эти данные (desLock := WinApi.GlobalLock (des);). Как дальше подключиться к данным по этому дескриптору не знаю.

Нашёл что после этого надо в обратном порядке: WinApi.GlobalUnlock (des); WinApi.CloseClipboard ();.

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

https://docs.microsoft.com/en-us/window ... globallock

Читайте данные побайтно, пока не встретите ноль.

https://docs.microsoft.com/en-us/window ... rd-formats

Автор:  Александр К [ Пятница, 27 Март, 2020 12:59 ]
Заголовок сообщения:  Re: Буфер обмена

Александр Ильин писал(а):
...дальше можете оттуда читать.
Как это? Приведите пожалуйста пример.

Автор:  Александр Ильин [ Суббота, 28 Март, 2020 22:06 ]
Заголовок сообщения:  Re: Буфер обмена

Александр К писал(а):
Александр Ильин писал(а):
...дальше можете оттуда читать.
Как это? Приведите пожалуйста пример.
Тут пусть кто другой пособит. Я с Винапи дело ещё как-то имею, а с КП/ББ уже давно не доводилось. Подзабыл синтаксис.
Наверное, надо привести к типу POINTER TO SHORTCHAR с помощью SYSTEM.VAL, прочитать значение по указателю, куда-то к себе скопировать, инкрементировать указатель. Повторять, пока прочитанное не равно 0X.

Автор:  Иван Денисов [ Воскресенье, 29 Март, 2020 14:39 ]
Заголовок сообщения:  Re: Буфер обмена

Вот так работает
Код:
MODULE DemoClip;

IMPORT SYSTEM, WinApi, Log;

PROCEDURE Do*;
VAR des, desLock, i: INTEGER; str: WinApi.PtrSTR;
BEGIN
   des := WinApi.OpenClipboard(0);
   des := WinApi.GetClipboardData (WinApi.CF_TEXT);
   desLock := WinApi.GlobalLock(des);
   str := SYSTEM.VAL(WinApi.PtrSTR, desLock);
   
   i := 0;
   WHILE str[i] # 0X DO
      Log.Char(str[i]); INC(i)
   END;
   
   desLock := WinApi.GlobalUnlock(des);
   des := WinApi.CloseClipboard();
END Do;

END DemoClip.


Автор:  Info21 [ Воскресенье, 29 Март, 2020 22:53 ]
Заголовок сообщения:  Re: Буфер обмена

Ценно, спасибо.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/