繁体   English   中英

如何在python中使用win32运行文件并获取hwnd?

[英]How to run a file and get the hwnd using win32 in python?

我知道使用os.startfile('....')或os.system('....')可以运行文件,例如* .pdf,*。mp4等,但不能获取该文件的hwnd。 (我必须知道hwnd来控制窗口,例如,移动,调整大小或关闭它)

当然,我可以通过win32gui.FindWindow(None,“ file name”)获得hwnd,但是,如果有两个具有相同名称的窗口,则无法分别获取hwnd。

是否有功能可以运行文件并在win32中获取其hwnd?

像这样:

hwnd=win32.function("file dir/file name") // run a file like os.startfile(...)

//hwnd=-1 if failed

//hwnd=1234567 if successful

然后我可以运行多个文件并毫无问题地获取它们的hwnd。

提前致谢。

首先,“ hwnd”是一个模棱两可的概念。 一个进程可以没有窗口,也可以没有3000个窗口。

但是,让我们假设您正在运行的程序始终只有一个窗口,并且您需要知道哪些窗口属于您实际启动的进程,而不是已经运行的同一进程的另一个实例。 (否则,您可以按标题和类别进行搜索。)

因此,您需要某种方式来引用该过程。 如果您使用的是os.systemos.startfile ,则无法执行此操作,因此会陷入困境。 这只是代替使用subprocess模块的众多原因之一:

p = subprocess.Popen(args)
pid = p.pid

现在,您只枚举所有顶级窗口 ,然后获取每个 窗口 的PID并检查匹配的窗口

假设您已经安装了pywin32 ,并且使用的是Python 3.x,则如下所示:

def find_window_for_pid(pid):
    result = None
    def callback(hwnd, _):
        nonlocal result
        ctid, cpid = win32process.GetWindowThreadProcessId(hwnd)
        if cpid == pid:
            result = hwnd
            return False
        return True
    win32gui.EnumWindows(callback, None)
    return result

在Python 2.x中,没有nonlocal变量,因此您需要其他方法来将值从回调函数获取到外部函数,例如围绕可变变量的闭包(例如result = [None] ,然后设置result[0]而不是result )。


但是请注意,这很容易失败,因为当您首次启动该过程时,它可能直到几毫秒后才没有窗口。 如果没有父母与孩子之间进行同步的任何手段,那么实际上是无法解决的。 (你可以通过破解,比方说,睡了一秒钟,但具有相同的问题,因为任何试图入睡,而不是同步,大部分的时间,这将是时间太长,减少你的代码的响应/性能无缘无故,偶尔,当计算机繁忙时,它会变得太短而失败。)

真正解决此问题的唯一方法是使用pywin32 创建过程,而不是使用标准的Python代码。 然后,您可以处理该过程。 这意味着您可以等待孩子开始其窗口循环 ,然后仅枚举该进程的窗口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM