Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用win32运行文件并获取hwnd?_Python_Winapi - Fatal编程技术网

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

如何在python中使用win32运行文件并获取hwnd?,python,winapi,Python,Winapi,我知道使用os.startfile(“..”)或os.system(“..”)可以运行文件,例如,*.pdf、*.mp4等等,但它无法获取该文件的hwnd。(我必须知道hwnd以控制窗口,例如,移动、调整大小或关闭窗口) 当然,我可以通过win32gui.FindWindow(无,“文件名”)获取hwnd,但是,如果有两个窗口具有相同的名称,则无法单独获取hwnd 是否有函数可以在win32中运行文件并获取其hwnd 像这样: hwnd=win32.function("file dir/file

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

当然,我可以通过win32gui.FindWindow(无,“文件名”)获取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.system
os.startfile
,您没有办法做到这一点,因此您会陷入困境。这只是使用该模块的众多原因之一:

p = subprocess.Popen(args)
pid = p.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
在Python2.x中,没有
非局部的
,因此您需要一些其他方法来从外部函数的回调中获取值,比如围绕可变虚拟变量的闭包(比如
result=[None]
,然后设置
result[0]
,而不是
result


但是请注意,这很容易失败,因为当您第一次启动该进程时,它可能直到几毫秒后才有窗口。如果没有一些在父级和子级之间进行同步的方法,就真的没有办法解决这个问题。(比如说,你可以通过睡眠一秒钟来破解它,但这与大多数时候尝试睡眠而不是同步的问题相同,它会太长,无缘无故降低代码的响应/性能,有时,当计算机忙时,它会太短而失败。)

真正解决这个问题的唯一方法是使用
pywin32
to,而不是使用标准的Python代码。然后你就掌握了这个过程。这意味着您可以只枚举该进程的窗口。

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

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

因此,您需要某种方法来引用该过程。如果您使用的是
os.system
os.startfile
,您没有办法做到这一点,因此您会陷入困境。这只是使用该模块的众多原因之一:

p = subprocess.Popen(args)
pid = p.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
在Python2.x中,没有
非局部的
,因此您需要一些其他方法来从外部函数的回调中获取值,比如围绕可变虚拟变量的闭包(比如
result=[None]
,然后设置
result[0]
,而不是
result


但是请注意,这很容易失败,因为当您第一次启动该进程时,它可能直到几毫秒后才有窗口。如果没有一些在父级和子级之间进行同步的方法,就真的没有办法解决这个问题。(比如说,你可以通过睡眠一秒钟来破解它,但这与大多数时候尝试睡眠而不是同步的问题相同,它会太长,无缘无故降低代码的响应/性能,有时,当计算机忙时,它会太短而失败。)


真正解决这个问题的唯一方法是使用
pywin32
to,而不是使用标准的Python代码。然后你就掌握了这个过程。这意味着您可以只枚举该进程的窗口。

感谢您提供这篇优雅而有用的文章。感谢您提供这篇优雅而有用的文章。