Как активировать ввод с клавиатуры ПК в Kotlin Desktop Compose

Я собираюсь разработать POS-систему с использованием Kotlin Jetpack Compose, и я хочу знать, как запускать события ввода с клавиатуры внутри моего проекта.

2 ответа

Вы также можете использовать , как говорится в документации:

позволит ему перехватывать события аппаратных клавиш, когда он (или один из его дочерних элементов) находится в фокусе.

Итак, вам нужно сделать предмет или одного из его дочерних элементов сфокусированными и сфокусированными. Узнайте больше о фокусировке в сочинении в модификатор ключевого событияэтой статье

Для этого вам понадобится FocusRequester, в моем примере я прошу сфокусироваться, когда представление визуализируется с использованием LaunchedEffect.

На будущее обратите внимание, что если пользователь нажимает на текстовое поле, или другой фокусируемый элемент получит фокус, ваше представление потеряет его. Если это сфокусированное представление находится внутри вашего представления с onKeyEvent обработчик, это все равно будет работать.

Пустое поле не может стать сфокусированным, поэтому вам нужно добавить какой-то размер с помощью модификатора. Он по-прежнему будет невидимым:

      val requester = 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()
}

Или просто добавьте контент в Box так он будет растягиваться и .size модификатор больше не понадобится

Следуя второму варианту ответа Филиппа, можно получить странное поведение, когда вы устанавливаете фокус и по какой-то причине щелкаете внутри окна приложения. При этом возможно «потерять» фокус, а ключевые события не обрабатываются должным образом.

Чтобы избежать этого, предлагается вручную решить эту проблему, добавив модификатор щелчка/нажатия, который просто указывает, что при обнаружении щелчка/нажатия requesterснова запрашивает фокус. Смотри ниже:

      val requester = FocusRequester()
  Box(
    Modifier
       //pointer input handles [onPress] to force focus to the [requester]
      .pointerInput(key1 = true) {
        detectTapGestures(onPress = {
          requester.requestFocus()
        })
      }
      .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()
      .fillMaxSize()
      .background(Color.Cyan)
  )
  LaunchedEffect(Unit) {
    requester.requestFocus()
  }
Другие вопросы по тегам