通过 python 脚本控制第三方应用程序时等待用户输入
Waiting for user input when controlling 3rd party application via python script
我正在编写一个供项目团队成员使用的脚本。作为脚本的一部分,我正在通过 Citrix 启动第 3 方专有应用程序 运行。我将主要使用该脚本向该应用程序发送密钥,但启动后的第一步是让用户登录。
因为我希望用户在脚本 运行ning 时登录,而不是更早地从某种 GUI 输入请求 user/pass,并且因为 Citrix 需要时间来launch 各不相同,我想包含某种逻辑来检测用户何时登录,然后从那里恢复脚本,而不是包含令人讨厌的长时间隐式等待或冒着脚本超时的风险。
有没有办法使用 win32com.client 检测用户击键(或检测应用程序本身状态的变化)?请参阅下面的相关代码以启动应用程序:
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('C:\Citrix\[rest of path])
编辑:
根据 Vasily 在下面评论中的建议,我尝试使 "hook and listen" code 适应我的场景,但没有成功。当我启动我的文件时,我的终端甚至没有收到异常消息,我收到一个 Windows 弹出窗口,显示 Python 遇到问题需要退出。
我是这样改编的:
#[omitting import lines for brevity]
def on_timer():
"""Callback by timer out"""
win32api.PostThreadMessage(main_thread_id, win32con.WM_QUIT, 0, 0);
def on_event(args):
"""Callback for keyboard and mouse events"""
if isinstance(args, KeyboardEvent):
for i in range(1,100):
time.sleep(1)
if args.pressed_key == 'Lcontrol':
break
def init():
hk = Hook()
hk.handler = on_event
main_thread_id = win32api.GetCurrentThreadId()
t = Timer(55.0, on_timer) # Quit after 55 seconds
t.start()
hk.hook(keyboard=True, mouse=True)
当第 3 方 Citrix 应用程序开始在我的主脚本中启动时,我调用 hookandlisten.init()。
提醒一下,我的目标是等到用户发送特定的击键(这里我选择了 Control),然后再继续执行主脚本的其余部分。
通过消除计时器并在正确击键时松开键盘来解决此问题:
import win32api
import win32con
from pywinauto.win32_hooks import Hook
from pywinauto.win32_hooks import KeyboardEvent
from pywinauto.win32_hooks import MouseEvent
def on_event(args):
"""Callback for keyboard and mouse events"""
if isinstance(args, KeyboardEvent):
if args.current_key == 'Lcontrol' and args.event_type == 'key down':
print("Success")
hk.unhook_keyboard()
return
def init():
hk.handler = on_event
hk.hook(keyboard=True, mouse=False)
hk = Hook()
我正在编写一个供项目团队成员使用的脚本。作为脚本的一部分,我正在通过 Citrix 启动第 3 方专有应用程序 运行。我将主要使用该脚本向该应用程序发送密钥,但启动后的第一步是让用户登录。
因为我希望用户在脚本 运行ning 时登录,而不是更早地从某种 GUI 输入请求 user/pass,并且因为 Citrix 需要时间来launch 各不相同,我想包含某种逻辑来检测用户何时登录,然后从那里恢复脚本,而不是包含令人讨厌的长时间隐式等待或冒着脚本超时的风险。
有没有办法使用 win32com.client 检测用户击键(或检测应用程序本身状态的变化)?请参阅下面的相关代码以启动应用程序:
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('C:\Citrix\[rest of path])
编辑: 根据 Vasily 在下面评论中的建议,我尝试使 "hook and listen" code 适应我的场景,但没有成功。当我启动我的文件时,我的终端甚至没有收到异常消息,我收到一个 Windows 弹出窗口,显示 Python 遇到问题需要退出。
我是这样改编的:
#[omitting import lines for brevity]
def on_timer():
"""Callback by timer out"""
win32api.PostThreadMessage(main_thread_id, win32con.WM_QUIT, 0, 0);
def on_event(args):
"""Callback for keyboard and mouse events"""
if isinstance(args, KeyboardEvent):
for i in range(1,100):
time.sleep(1)
if args.pressed_key == 'Lcontrol':
break
def init():
hk = Hook()
hk.handler = on_event
main_thread_id = win32api.GetCurrentThreadId()
t = Timer(55.0, on_timer) # Quit after 55 seconds
t.start()
hk.hook(keyboard=True, mouse=True)
当第 3 方 Citrix 应用程序开始在我的主脚本中启动时,我调用 hookandlisten.init()。
提醒一下,我的目标是等到用户发送特定的击键(这里我选择了 Control),然后再继续执行主脚本的其余部分。
通过消除计时器并在正确击键时松开键盘来解决此问题:
import win32api
import win32con
from pywinauto.win32_hooks import Hook
from pywinauto.win32_hooks import KeyboardEvent
from pywinauto.win32_hooks import MouseEvent
def on_event(args):
"""Callback for keyboard and mouse events"""
if isinstance(args, KeyboardEvent):
if args.current_key == 'Lcontrol' and args.event_type == 'key down':
print("Success")
hk.unhook_keyboard()
return
def init():
hk.handler = on_event
hk.hook(keyboard=True, mouse=False)
hk = Hook()