当我在cmd窗口中运行ROS2节点时,我试图检测键盘按压。
我已经用pynput写了这个,但是它检测到所有按下的键,即使我在另一个窗口。
import sys
import os
import signal
import time
from pynput import keyboard
import rclpy
from rclpy.parameter import Parameter
import std_msgs.msg
class KeystrokeListen:
def __init__(self, name=None):
self.node = rclpy.create_node(name or type(self).__name__)
self.pub_glyph = self.node.create_publisher(std_msgs.msg.String, 'glyphkey_pressed', 10)
self.pub_code = self.node.create_publisher(std_msgs.msg.UInt32, 'key_pressed', 10)
def spin(self):
with keyboard.Listener(on_press=self.on_press, on_release=self.on_release) as listener:
while rclpy.ok() and listener.running:
rclpy.spin_once(self.node, timeout_sec=0.1)
@property
def logger(self):
return self.node.get_logger()
def on_release(self, key):
pass
def on_press(self, key):
try:
char = getattr(key, 'char', None)
if isinstance(char, str):
self.logger.info('pressed ' + char)
self.pub_glyph.publish(self.pub_glyph.msg_type(data=char))
else:
try:
# known keys like spacebar, ctrl
name = key.name
vk = key.value.vk
except AttributeError:
# unknown keys like headphones skip song button
name = 'UNKNOWN'
vk = key.vk
self.logger.info('pressed {} ({})'.format(name, vk))
# todo: These values are not cross-platform. When ROS2 supports Enums, use them instead
self.pub_code.publish(self.pub_code.msg_type(data=vk))
except Exception as e:
self.logger.error(str(e))
raise
if key == keyboard.Key.esc:
self.logger.info('stopping listener')
raise keyboard.Listener.StopException
os.kill(os.getpid(), signal.SIGINT)
def main(args=None):
rclpy.init(args=args)
KeystrokeListen().spin()
if __name__ == '__main__':
main()我在这里发现了一些与How to detect key presses?相关的内容,比如获取当前窗口的名称,然后是希望检测到按键的窗口的名称:
from win32gui import GetWindowText, GetForegroundWindow
current_window = (GetWindowText(GetForegroundWindow()))
desired_window_name = "Stopwatch"然而,我只想让我的程序工作,无论何时我在cmd,我启动它。
知道吗??
提前谢谢你!
发布于 2022-05-08 17:34:09
实际上,这个模块可能会帮助您解决问题。下面是我如何做到这一点的一个例子:
from win32gui import GetForegroundWindow, GetWindowText
if all(win_name in GetWindowText(GetForegroundWindow()) for win_name in ["cmd.exe", __file__]):
print("this program's cmd is focused!")https://stackoverflow.com/questions/72163052
复制相似问题