如何在 Kotlin Desktop Compose 中触发 PC 键盘输入

Pra*_*Dev 3 kotlin android-jetpack-compose compose-desktop

我将使用 Kotlin Jetpack Compose 开发一个 POS 系统,我想知道如何在我的项目中触发键盘输入事件。

Phi*_*hov 6

在 Compose Desktop 中,您可以使用参数监听关键事件onKeyEvent Window

Window(
    onCloseRequest = ::exitApplication,
    visible = visible,
    onKeyEvent = {
        if (it.isCtrlPressed && it.key == Key.A) {
            println("Ctrl + A is pressed")
            true
        } else {
            // let other handlers receive this event
            false
        }
    }
) {
    App()
}
Run Code Online (Sandbox Code Playgroud)

另一种选择也适用于 Android 中的 Compose,即使用Modifier.onKeyEvent。正如文档所说:

将允许它在它(或其子级之一)聚焦时拦截硬件按键事件。

因此,您需要使一项或其子项之一成为可聚焦且集中的。在本文中查看有关撰写焦点的更多信息

为此,您需要一个FocusRequester,在我的示例中,我在使用 呈现视图时询问焦点LaunchedEffect

对于未来的注释,如果用户点击文本字段,或其他可聚焦元素将获得焦点,您的视图将失去焦点。如果这个聚焦视图位于处理程序的视图内onKeyEvent,它仍然可以工作。

空框无法获得焦点,因此您需要使用修饰符添加一些大小。它仍然是不可见的:

val requester = remember { FocusRequester() }
Box(
    Modifier
        .onKeyEvent {
            if (it.isCtrlPressed && it.key == Key.A) {
                println("Ctrl + A is pressed")
                true
            } else {
                // let other handlers receive this event
                false
            }
        }
        .focusRequester(requester)
        .focusable()
        .size(10.dp)
)
LaunchedEffect(Unit) {
    requester.requestFocus()
}
Run Code Online (Sandbox Code Playgroud)

或者,只需添加内容Box即可拉伸,并且.size不再需要修改器