Общесистемный буфер обмена

Internal structure and you change requests/suggestions
  • Я не силён в придумывании API, что-то вроде:

    === Функция 73 ===
    - Подфункция 1 - поместить данные в буфер обмена
    - Подфункция 2 - прочитать данные
    - Подфункция 3 - очистить буфер обмена

    Обмен через структуру:
    а) тип данных - 1 - число, 2 - строка, 3 - файл где есть адрес файла/его имя затем идут данные, 4 - просто двоичные данные
    б) имя программы/её PID, которая поместила данные в буфер
    Из хаоса в космос
  • Предлагаю использовать строку с MIME-типом в качестве типа данных. Кому нужно будет просто текст - будет её игнорировать. Вместо содержимого файла/файлов лучше хранить их адреса - будет куда быстрее. Хотя можно оба варианта.
  • Я бы свел всё к трём типам:
    1. Текстовая UTF-16 ( или 32 ? ) строка с указанием длины.
    2. Битмап 24 и 32 bpp с указанием размеров.
    3. Raw данные с укзанием размера. В этом случае может храниться всё что угодно, вначале следует заголовок стандартного размера, затем данные.

    Ядро одновременно хранит по одному объекту каждого типа. Запись нового объекта уничтожает предыдущий.
    Last edited by Serge on Fri Dec 07, 2012 9:29 pm, edited 1 time in total.
  • Нормально, а имя программы, которая поместила данные в буфер и её PID?
    Из хаоса в космос
  • А зачем ? Не проблема конечно.
  • А как узнать, что вставлять? По ctrl+shift+v можно организовать помещение asciiz-строки в буфер клавиш, полученных от клавы?
  • Это сама программа должна обрабатывать нажатие клавиш. И потом читать буфер обмена.
    Кстати строка должна быть в unicode.
  • Serge wrote:А зачем ? Не проблема конечно.
    Я думаю, пригодиться. Можно будет даже организовать чат между программами по типу IPC, только быстрее и проще. Ещё могут быть скопированые специфические данные для какой-то конкретной программы.
    Из хаоса в космос
  • Такой вариант:


    SysFnXX: Работа с общесистемным буфером обмена
    eax = XX

    Подфункция 1: Скопировать в буфер
    ebx = 1
    ecx = количество копируемых байт
    edx = тип данных
    esi = указатель на копируемые данные

    Подфункция 2: Прочитать из буфера
    ebx = 2
    ecx = количество читаемых байт
    edi = указатель на буфер-приёмник

    Подфункция 3: Узнать тип данных в буфере
    ebx = 3

    Подфункция 4: Узнать количество байт в буфере
    ebx = 4

    Подфункция 5: Очистить буфер
    ebx = 5


    Соглашение о типах только между приложениями. Ядру должно быть всё равно что в буфере.
    Сначала приложение узнаёт тип данных, и если оно может с ним работать, то читает данные.

    Какой будет максимально возможный размер буфера?
    А то кто-нибудь скопирует туда очень много и будет оно там висеть.

    PID программы, поместившей данные, думаю, что не нужен.



    Подфункции 3 и 4 можно объединить в одну "Получить информацию о данных буфера".
    Возвращаемые значения: eax = тип данных; edx = количество байт.
  • Можно будет даже организовать чат между программами по типу IPC, только быстрее и проще.
    Так и подумал. Вот за это надо будет сразу бить по рукам. Для IPC есть свои функции. Если они кривые и неудобные сделайте новые прямые и удобные.
  • 0CodErr
    Прежде чем работать с буфером его надо заблокировать. А потом разблокировать.
  • Serge wrote:Если они кривые и неудобные сделайте новые прямые и удобные.
    Ты это о руках, конечно?:)
  • Думаю надо делать два отдельных режима хранения текста. ASCIIZ с указанием локали (кодовой таблицы) и unicode.
  • Serge wrote:0CodErr
    Прежде чем работать с буфером его надо заблокировать. А потом разблокировать.
    О синхронизации должно заботится ядро ИМХО. Для приложении все должно работать прозрачно.
  • Who is online

    Users browsing this forum: No registered users and 9 guests