如何在python中使用win32运行文件并获取hwnd?
我知道使用os.startfile(“..”)或os.system(“..”)可以运行文件,例如,*.pdf、*.mp4等等,但它无法获取该文件的hwnd。(我必须知道hwnd以控制窗口,例如,移动、调整大小或关闭窗口) 当然,我可以通过win32gui.FindWindow(无,“文件名”)获取hwnd,但是,如果有两个窗口具有相同的名称,则无法单独获取hwnd 是否有函数可以在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
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代码。然后你就掌握了这个过程。这意味着您可以只枚举该进程的窗口。感谢您提供这篇优雅而有用的文章。感谢您提供这篇优雅而有用的文章。