【问题标题】:How to open a program using keyboard input?如何使用键盘输入打开程序?
【发布时间】:2021-06-20 22:58:07
【问题描述】:

我的项目是制作一个可以在后台玩游戏或其他程序时运行的程序。 当您按下某个键时,您的记事本应该会在您再次按下相同的键后打开和关闭。

我已经设法用子进程打开记事本并且工作正常,但我不知道只有在按下某个键时才打开它。 感谢您的帮助!

编辑: 我已经尝试过的:

import subprocess
import keyboard

if keyboard.is_pressed('k'):
    subprocess.Popen('C:\\Windows\\System32\\notepad.exe')

input()

这里它只是没有检测到任何键盘输入,最后的 input() 使程序不会立即关闭

import subprocess
import keyboard

keyboard.add_hotkey('ctrl+k', print,args=("hello", "test"))

input()

如果我按下“ctrl+k it”,将打印 hello test,这意味着热键可以正常工作。当我将这部分“print,args=("hello", "test")" 切换到 "subprocess.Popen('C:\Windows\System32\notepad.exe')" 时(它应该打开程序而不是打印 hello测试)记事本在我运行程序后立即打开,当我按“ctrl+k”时出现大错误。

【问题讨论】:

  • 嗨,丹妮,欢迎您。如果您发布一个最低限度的可重现示例,那么您将获得更多的运气,这样人们会更容易看到您尝试过的内容并提出不同的方法。
  • @afterburner 好的,我会尝试重现我之前做的代码。

标签: python windows input keyboard


【解决方案1】:

下面是一个更复杂但仍然有效的示例。使用此代码,您的程序将始终聆听键盘,不仅在您专注于输入时,因此在您的情况下可能更实用

from pynput import keyboard
import subprocess
import threading

class MyException(Exception): pass

class Listening:
    """Is allways waiting for the keyboard input"""
    def __init__(self):
        self.notepad_open = False # to know the state
        with keyboard.Listener(
                on_press=self.on_press) as listener:
            try:
                listener.join()
            except:
                pass
    
    def on_press(self, key):
        try:
            if key.char == "k":
                if not self.notepad_open:
                    self.subprocess = \
                        subprocess.Popen('C:\\Windows\\System32\\notepad.exe')
                    self.notepad_open = True # update state
                else:
                    self.subprocess.kill()
                    self.notepad_open = False # update state
        except: # special key was pressed
            pass

thread = threading.Thread(target=lambda: Listening())
thread.start()

【讨论】:

  • 非常感谢,这正是我想做的!
【解决方案2】:

问题是您在开始时只检查一次键“k”。如果你想让程序正常工作,那么你应该试试这个:

import time
import subprocess
import keyboard
while True:
    if keyboard.is_pressed('k'):
        subprocess.Popen('C:\\Windows\\System32\\notepad.exe')
        time.sleep(5)

-我使用了这个时间,所以你只能在 5 秒内打开程序一次(如果你好奇,看看没有它会发生什么)-

【讨论】:

  • 谢谢!我忘记了它只检查一次 k 并且没有 time.sleep(5) 它只会像垃圾邮件一样打开记事本 100 次。感谢您的回答,我学到了一些新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2015-07-09
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多