간단한 전역 키보드 단축키 처리기

간단한 전역 키보드 단축키 처리기

응, 나도 거기 있다는 걸 알아모바일 지식 기반텍스트 콘솔 및 그래픽 세션을 포함하여 어디에서나 사용할 수 있는 전역 키보드 단축키를 할당할 수 있지만 단일 키보드 단축키에 대해 추가 데몬 프로세스를 실행하고 싶지 않습니다(또한 오랫동안 유지 관리되지 않음). 나는 구성 옵션이 없고 최소한의 코드만 사용하여 더 간단한 것을 원했습니다.

작업은 다음 키 조합을 누를 때 명령을 실행하는 것입니다.

Win+ End->systemctl suspend

이것은 stackoverflow.com에 게시할 가치가 있을지 모르지만 완전히 확신할 수는 없습니다.

답변1

따라서 Linux에는 이런 종류의 일을 위한 매우 좋은 프레임워크가 있습니다. uinputevdev는 아무것도 숨기지 않는 멋진 인터페이스입니다. 날씬해요.

기본적으로 모든 Linux 배포판에는 python3-evdev패키지가 있습니다(적어도 debian, ubuntu 및 fedora에서는 이것이 패키지 이름입니다).

그런 다음 데몬을 작성하기 위한 코드 몇 줄만 있으면 됩니다.코드, 당신이 무엇을 하고 있는지 알 수 있도록 몇 가지 설명을 추가했습니다.

#!/usr/bin/python3
# Copyright 2022 Marcus Müller
# SPDX-License-Identifier: BSD-3-Clause
# Find the license text under https://spdx.org/licenses/BSD-3-Clause.html

from evdev import InputDevice, ecodes
from subprocess import run

# /dev/input/event8 is my keyboard. you can easily figure that one
# out using `ls -lh /dev/input/by-id`
dev = InputDevice("/dev/input/event8") 

# we know that right now, "Windows Key is not pressed" 
winkey_pressed = False
# suspending once per keypress is enough
suspend_ongoing = False

# read_loop is cool: it tells Linux to put this process to rest
# and only resume it, when there's something to read, i.e. a key
# has been pressed, released
for event in dev.read_loop():

  # only care about keyboard keys
  if event.type == ecodes.EV_KEY:

    # check whether this is the windows key; 125 is the 
    # keyboard for the windows key
    if event.code == 125:
      # now check whether we're releasing the windows key (val=00) 
      # or pressing (1) or holding it for a while (2)
      if event.value == 0:
        winkey_pressed = False
        # clear the suspend_ongoing (if set)
        suspend_ongoing = False
      if event.value in (1, 2):
        winkey_pressed = True
    # We only check whether the end key is *held* for a while
    # (to avoid accidental suspend)
    # key code for END is 107
    elif winkey_pressed and event.code == 107 and event.value == 2:
      run(["systemctl", "suspend"])
      # disable until win key is released
      suspend_ongoing = True

그게 다야. 귀하의 데몬은 단 16줄의 코드입니다.

: 을 사용하여 직접 실행할 수 있지만 sudo python자동으로 시작하고 싶을 수도 있습니다.

파일로 저장 /usr/local/bin/keydaemon하고 sudo chmod 755 /usr/local/bin/keydaemon실행 가능하게 만드세요. /usr/lib/systemd/system/keydaemon.unit콘텐츠가 포함된 파일 추가

[Unit]
Description=Artem's magic suspend daemon

[Service]
ExecStart=/usr/local/bin/keydaemon

[Install]
WantedBy=multi-user.target

그런 다음 sudo systemctl enable --now keydaemon데몬이 시작되었는지 확인할 수 있습니다(즉시 및 이후 부팅 시마다).

관련 정보