通过python脚本控制第三方应用程序时等待用户输入

通过python脚本控制第三方应用程序时等待用户输入,python,windows,pywin32,pywinauto,Python,Windows,Pywin32,Pywinauto,我正在编写一个供项目团队成员使用的脚本。作为脚本的一部分,我将通过Citrix启动一个第三方专有应用程序。我将主要使用该脚本向该应用程序发送密钥,但它启动后的第一步是让用户登录 因为我希望用户在脚本运行时登录,而不是在前面请求某种GUI输入的user/pass,而且由于Citrix启动所需的时间不同,我希望包含某种逻辑,可以检测用户何时登录,然后从那里恢复脚本,而不是包含令人讨厌的长时间的隐式等待或冒脚本超时的风险 是否有方法使用win32com.client检测用户击键(或检测应用程序本身状态

我正在编写一个供项目团队成员使用的脚本。作为脚本的一部分,我将通过Citrix启动一个第三方专有应用程序。我将主要使用该脚本向该应用程序发送密钥,但它启动后的第一步是让用户登录

因为我希望用户在脚本运行时登录,而不是在前面请求某种GUI输入的user/pass,而且由于Citrix启动所需的时间不同,我希望包含某种逻辑,可以检测用户何时登录,然后从那里恢复脚本,而不是包含令人讨厌的长时间的隐式等待或冒脚本超时的风险

是否有方法使用win32com.client检测用户击键(或检测应用程序本身状态的变化)?有关启动应用程序的相关代码,请参见下文:

import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('C:\Citrix\[rest of path])
编辑: 根据瓦西里的建议,在下面的评论中,我试图根据我的场景调整,但没有成功。当我启动我的文件时,我的终端甚至没有收到异常消息,我得到一个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)
当第三方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()

示例:。这看起来应该可以做到这一点!我来测试一下。这是否也可用于触发键盘事件(即,不只是发送击键)?您的意思是按住键,然后在执行其他操作后释放键?这是可能的,但需要更详细的描述来提供一个示例或链接到正确的文档页面。在上面的模块中,有一件事我仍在苦苦挣扎,那就是它似乎在监听一个动作,然后执行一个指定的动作,但我似乎无法让它执行“等待”功能——也就是说,一旦它听到按下“回车”键,就继续我的脚本的其余部分,但除非或直到按下该键,否则什么也不做。@VasilyRyabov我尝试过修改该模块以匹配我的场景(参见编辑的帖子),但没有成功。我哪里做错了?