我有一个悖论。我使用GetKeyState来检索给定vk_code的状态。我已经开发了两个功能来帮助我完成任务:
import win32api
def get_key_state(vk_code):
state = int(win32api.GetKeyState(vk_code))
if state == 1 or state == -127:
return 1 # Key is on.
elif state == 0 or state == -128:
return 0 # Key is off.
def press_key(vk_code):
state = int(win32api.GetKeyState(vk_code))
if state == -127 or state == -128:
return 1 # Key was pressed.
else:
return 0 # Key was released.
state
的值从0开始,然后在按下给定键时,它变为-127,然后当我释放时,它变为1,然后在按下键的同时再次,它变为-128,然后最终回到0。
当我在主循环中使用press_key时,如下所示:
if __name__ == "__main__":
while True:
p_key = 80
if press_key(p_key):
print("P key was pressed.")
按下并释放给定键时,我得到以下输出:
如果按键只有>>,如果它在while循环中怎么办?像这样:
但是没有打破整个循环。
观察:我知道我在这里重新发明轮子(因为我可以使用PyHook或其他东西),但我真的想知道它!我想要"事件"只能在主循环中触发一次(即使按键保持按下状态),而且我没有掌握逻辑来执行此操作。
答案 0 :(得分:1)
好吧,如果你想确保印刷机只注册一次,无论它们持有多长时间,你都可以有一个状态变量来检查这是否是第一次注册特定的按键:
import win32api
HUMAN_KEYPRESS_TIME = 0.3
def press_key(vk_code):
state = int(win32api.GetKeyState(vk_code))
if state == -127 or state == -128:
return 1
else:
return 0
keyDown = False
if __name__ == "__main__":
firstPress = True
while True:
p_key = 80
if press_key(p_key):
if firstPress:
firstPress = False
print("P key was pressed.")
else:
firstPress = True
这不会阻止循环,它允许您按键盘的速度按键;另一种方法只允许你按下每300毫秒并阻止循环那么久。
答案 1 :(得分:0)
事实证明,解决方案非常明显。我使用time.sleep()完美地解决了这个问题。
import win32api
import time
HUMAN_KEYPRESS_TIME = 0.3
def press_key(vk_code):
state = int(win32api.GetKeyState(vk_code))
if state == -127 or state == -128:
return 1 # Key was pressed.
else:
return 0 # Key was released.
if __name__ == "__main__":
while True:
p_key = 80
if press_key(p_key):
print("P key was pressed.")
time.sleep(HUMAN_KEYPRESS_TIME)
我得出的结论是,不能只执行一次"在按住键的同时,我意识到答案是时间。如果我希望只需按一次键就可以执行一次代码块,我只需要在每次按下物理按键之间的整个应用程序中休眠。