首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cmd窗口中检测键盘按下

在cmd窗口中检测键盘按下
EN

Stack Overflow用户
提问于 2022-05-08 16:29:12
回答 1查看 219关注 0票数 0

当我在cmd窗口中运行ROS2节点时,我试图检测键盘按压。

我已经用pynput写了这个,但是它检测到所有按下的键,即使我在另一个窗口。

代码语言:javascript
复制
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?相关的内容,比如获取当前窗口的名称,然后是希望检测到按键的窗口的名称:

代码语言:javascript
复制
from win32gui import GetWindowText, GetForegroundWindow
current_window = (GetWindowText(GetForegroundWindow()))
desired_window_name = "Stopwatch"

然而,我只想让我的程序工作,无论何时我在cmd,我启动它。

知道吗??

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2022-05-08 17:34:09

实际上,这个模块可能会帮助您解决问题。下面是我如何做到这一点的一个例子:

代码语言:javascript
复制
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!")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72163052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档