Как записать строку в буфер обмена (ОС Windows) с помощью приложения Kotlin / Native? - PullRequest
0 голосов
/ 18 июня 2019

Я очень плохо знаком с Kotlin и создаю командную строку .exe в Windows, используя Kotlin / Native. Приложение должно читать из текстового файла и печатать на экране, строка за строкой. Когда он достигает последней строки файла, он должен поместить его в буфер обмена.

aFile.txt выглядит примерно так:

one
two
three
...
...
the last line

и код read.kt (Kotlin / Native) У меня пока есть такое:

import kotlinx.cinterop.*
import platform.posix.*

fun main(args: Array<String>) {

    if (args.size != 1) {
        println("Usage: read.exe <file.txt>")
        return
    }

    val fileName = args[0]
    val file = fopen(fileName, "r")

    if (file == null) {
        perror("cannot open input file $fileName")
        return
    }

    try {
        memScoped {
            val bufferLength = 64 * 1024
            val buffer = allocArray<ByteVar>(bufferLength)

            do {
                val nextLine = fgets(buffer, bufferLength, file)?.toKString()
                if (nextLine == null || nextLine.isEmpty()) break
                print("${nextLine}")
            } while (true)

        }
    } finally {
        fclose(file)
    }

}

<ч /> Приведенный выше код печатает каждую строку на экране, но как мне написать строку "the last line" в буфере обмена компьютера? Я ищу нативное (не Java) решение, если это возможно.

Большое спасибо.

<ч />

Обновление:

Очевидно, это не то решение, которое я искал, но я пока не понимаю, о чем они здесь говорят (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboarddata).

В качестве временного исправления я смог получить то, что мне было нужно, используя system(), echo и clip с кодом, подобным следующему:

system("echo ${nextLine} | clip")
print("${nextLine}")

1 Ответ

1 голос
/ 18 июня 2019

В Windows вы можете работать с буфером обмена через WinAPI, как вы видите там . Ссылка говорит, что вы должны использовать функции из заголовка winuser.h. Насколько я знаю, этот заголовок включен в windows.h, поэтому он входит в ваш пакет platform.windows.*. Вы можете утвердить его, проверив файлы репозитория Kotlin / Native .


Чтобы уточнить, что я имел в виду, я написал этот небольшой пример использования platform.windows.*. Вы можете добавить эту функцию в свой код и вызывать ее, когда вам нужно скопировать некоторую строку.

import platform.windows.*

fun toClipboard(lastLine:String?){
    val len = lastLine!!.length + 1
    val hMem = GlobalAlloc(GMEM_MOVEABLE, len.toULong())
    memcpy(GlobalLock(hMem), lastLine.cstr, len.toULong())
    GlobalUnlock(hMem)
    val hwnd = HWND_TOP
    OpenClipboard(hwnd)
    EmptyClipboard()
    SetClipboardData(CF_TEXT, hMem)
    CloseClipboard()
}
...