如何使用 Kotlin/Native 应用程序将字符串写入剪贴板 (Windows OS)?
How to write a string to clipboard (Windows OS) with a Kotlin/Native application?
我是 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)解决方案。
非常感谢。
Update:
显然,这不是我要找的解决方案,但我还不明白他们在说什么 (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboarddata)。
作为临时修复,我能够使用 system()
、echo
和 clip
获得我需要的东西,代码如下:
system("echo ${nextLine} | clip")
print("${nextLine}")
在 Windows 中,您可以通过 WinAPI 使用剪贴板,如您所见 there. The reference says, that you got to use functions from the winuser.h
header. This header is included in windows.h
, as far as I know, so it is in your platform.windows.*
package. You can approve it by checking Kotlin/Native repository files。
为了澄清我的意思,我写了这个 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()
}
尝试以下操作:
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)
}
我是 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)解决方案。
非常感谢。
Update:
显然,这不是我要找的解决方案,但我还不明白他们在说什么 (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboarddata)。
作为临时修复,我能够使用 system()
、echo
和 clip
获得我需要的东西,代码如下:
system("echo ${nextLine} | clip")
print("${nextLine}")
在 Windows 中,您可以通过 WinAPI 使用剪贴板,如您所见 there. The reference says, that you got to use functions from the winuser.h
header. This header is included in windows.h
, as far as I know, so it is in your platform.windows.*
package. You can approve it by checking Kotlin/Native repository files。
为了澄清我的意思,我写了这个 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()
}
尝试以下操作:
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)
}