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



我对 Kotlin 很陌生,并使用 Kotlin/Native 在 Windows 上制作命令行.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()echoclip获得我需要的东西,代码如下:

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

尝试以下操作:

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

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

如果你想在未来瞄准其他平台,你也可以看看 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")
}
}

最新更新