如何使用 Kotlin/Native 应用程序将字符串写入剪贴板(Windows 操作系统)?

问题描述 投票:0回答:3

我对 Kotlin 非常陌生,并且在 Windows 上使用 Kotlin/Native 制作命令行 .exe。应用程序应从文本文件中读取并逐行打印在屏幕上。当它到达文件的最后一行时,应该将其放入剪贴板。

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://learn.microsoft.com/en-us/windows/desktop/api/winuser/ nf-winuser-setclipboarddata)。

作为临时修复,我能够使用

system()
echo
clip
获得我需要的内容,代码如下:

system("echo ${nextLine} | clip")
print("${nextLine}")
kotlin clipboard kotlin-native
3个回答
6
投票

尝试以下操作:

import java.awt.Toolkit
import java.awt.datatransfer.Clipboard
import java.awt.datatransfer.StringSelection

fun setClipboard(s: String) {
    val selection = StringSelection(s)
    val clipboard: Clipboard = Toolkit.getDefaultToolkit().systemClipboard
    clipboard.setContents(selection, selection)
}

3
投票

在 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() }
    

0
投票
如果您将来想瞄准其他平台,也可以看看 Compose Multiplatform。它是多平台的,因此它也可以在 Mac、Android、iOS、Web 上运行。

使用很简单:

@Composable fun Widget(){ val clipboard: ClipboardManager = LocalClipboardManager.current Row(modifier = Modifier.clickable { clipboard.setText(AnnotatedString("Some text here")) }) { Text(text = "Click me") } }
    
© www.soinside.com 2019 - 2024. All rights reserved.