Winapi PyWin32:detect";准备好了吗;在再次使用SendKeys之前?

Winapi PyWin32:detect";准备好了吗;在再次使用SendKeys之前?,winapi,pywin32,wsh,sendkeys,wscript.shell,Winapi,Pywin32,Wsh,Sendkeys,Wscript.shell,我使用以下代码向应用程序发送击键: import win32com.client import time process_id = 2032 # I change this value if needed shell = win32com.client.Dispatch("WScript.Shell") shell.AppActivate(process_id) shell.SendKeys('^o') time.sleep(.5) # more input ... 问题是:在某一点上,一切都

我使用以下代码向应用程序发送击键:

import win32com.client
import time
process_id = 2032 # I change this value if needed
shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate(process_id)
shell.SendKeys('^o')
time.sleep(.5)
# more input ...

问题是:在某一点上,一切都会走下坡路,这意味着:无论出于何种原因,应用程序都会挂起(无法预测挂起的时间和时间!)。例如,不是通过{ENTER}命令单击“OK”按钮,而是该击键执行其他操作。在那之后,所有的击键都会把事情搞得一团糟,因为它们没有按预期的方式去做。顺便问一下,使用time.sleep和win32api.sleep有区别吗?是否有一种系统的方法来检查我发送按键的应用程序是否再次处于稳定的就绪状态?

如果应用程序是由您开发的,您可以使用它来检查应用程序窗口的响应。如果响应超时,应用程序将被视为挂起(未处于就绪状态)。

时间.sleep和
win32api.sleep
的函数是相同的,只是
time.sleep
以秒为单位,而
win32api.sleep
以毫秒为单位。此时使用sleep似乎毫无意义all@David:它确实有用。我可以使用睡眠延迟,让程序有时间打开文件、编辑或保存修改过的文件。我曾经有过这样的场景:它完全中断,没有延迟。但是,与其猜测哪个延迟可以处理任何情况,我更喜欢一个更系统的解决方案。如果应用程序是由我开发的,我就不需要向它发送击键;-)我尝试执行一个程序数千次(每个文件执行一次),但该程序没有API,也无法通过命令行执行。基于此,
Process。Responding
Property help?刚才看到最后一条注释:看起来像Process。在pywin32中,Responding不可用。我在文档中搜索了“responding”,但我只找到了两项似乎不相关的内容:-/我正试图找到一种方法将我的代码移植到C#,这样我就可以测试进程。responding,但它不像C#中那样简单,就像
shell=win32com.client.Dispatch(“WScript.shell”)
我想我找到了答案(部分)。看起来我使用AppActivate太多了。在SendKeys之前不久使用AppActivate似乎会把事情搞砸(吞下字母等)。所以我现在要做的是检查我的应用程序是否仍然有焦点。如果没有,我会重新聚焦并睡眠2秒钟,然后再发送按键(或者再次调用AppActivate,以防在睡眠过程中再次失去焦点)。