用Python切换窗口

2024-09-29 21:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

首先我要说的是,我对python非常缺乏经验,我希望这意味着我的问题的解决方案将很简单。

我的程序将在另一个窗口中执行简单的操作,因此理想情况下,我希望脚本在处理其余命令之前,确保另一个窗口最大化并处于活动状态。事实证明,这比我预想的要困难得多。

我非常肯定我可以通过win32gui使用find_窗口并将其设置为前台来实现这一点。当我遇到上一个问题时,我以为我找到了解决办法: Python Window Activation

不幸的是,我无法使用解决方案代码或操作它来解决我的问题,原因如下:

-用户定义find_窗口的方式只允许您根据窗口的类名进行选择,我不知道,也找不到,因为它只是一个运行在Java中的游戏。我似乎无法将该行更改为特定的windowname(我知道),因为它不是“默认参数”。

-我不想列举窗口来找到它,因为我不确定它是如何工作的。

-使用find_window_通配符(在脚本中编写的通配符)已成功地将窗口带到前台几次,但前提是该窗口已经打开,并且只能间歇性地工作。

-set_foreground()需要一个输入语句,无论我如何设置它,都会出现一个错误,即我的元素数目错误或窗口上的句柄无效。

我知道我很蠢;但是对于这个问题,一个清晰简洁的解决方案,或者至少对find_window/getwindow语法有一个很好的解释,对我自己和其他有这个问题的人来说都是天赐良机。


Tags: 命令程序脚本错误情况find解决方案window
2条回答

The way that user had defined find_window only allows you to choose by the classname of the window

用户定义它的方式是将这两个参数class_namewindow_name传递给^{}(后者反过来只调用Win32 API函数^{})。所以,就这样做:

windowmgr.find_window(None, 'My Window Name')

但即使这不是真的,也不需要使用他的find_window函数;很明显,如何调用win32gui.FindWindow自己:

hwnd = win32gui.FindWindow(None, 'My Window Name')

如果你想对FindWindow/EnumWindows/etc.语法有一个很好的解释,你有没有试着查看它们的文档?有什么你不明白的吗?

同时:

… the classname of the window, which I don't know and haven't been able to find since it is just a game running in Java

它在Java中运行有什么区别?你可以枚举窗口并打印出他们的类名,无论它们是用C++、java、.net、python或其他东西编写的。或者使用Visual Studio/VS Express附带的工具,或者任何你可以在网上找到的免费改进版本,比如MS Spy++,它可以让你指向一个窗口并给出标题和类名。

I don't want to enumerate the windows to find it as I'm not sure how that would work.

只要用正则表达式调用windowmgr.find_window_wildcard(wildcard),它就会枚举窗口并将它们的标题与该正则表达式进行比较。

如果要编写自己的代码来完成此任务,只需编写如下函数:

def my_callback(hwnd, cookie):

现在,当你这样做时:

win32gui.EnumWindows(my_callback, some_cookie)

…它将在每个窗口调用一次您的my_callback函数,其中hwnd是窗口(您可以传递给win32gui函数,例如GetWindowText),而cookie是您传入的some_cookie值。(如果不需要传入任何内容,只需传入None,并且不使用回调函数中的值。但您可以看到另一个应答器是如何使用它来传递正则表达式的。)

同时:

using find_window_wildcard as it's written in that script has managed to bring the window to the foreground a few times, but only if the window was already open, and it only works intermittently.

首先,如果窗口不存在,就不能将其带到前台。你认为这会怎样?

就间歇工作而言,我的猜测是有很多窗口与您的通配符匹配,程序将任意选择其中一个窗口。可能不是你想要的那个。(它甚至可能是一个隐藏的窗口或其他东西,所以你根本看不到任何事情发生。)

无论如何,您不需要使用find_window_wildcard;如果您知道确切的名称,请使用该名称。当然,它可能仍然不是唯一的(无论游戏的名称是什么,没有什么可以阻止你打开一封电子邮件或一个记事本窗口的相同标题…顺便说一句,这就是为什么你想先尝试类名),但至少它比一些未指定的通配符更有可能是唯一的。

那么,如果类名不是唯一的(或者,更糟的是,它是一个特殊的“number”类,比如32770用于一般的对话框窗口),而窗口名也不是唯一的呢?您可以通过查看所属进程或模块(exe/dll)或父窗口或其他任何内容来更好地缩小范围。您必须查看win32gui和/或MSDN文档(链接在上面)以查找可能要尝试的内容,并通过反复尝试(也要记住Spy工具),直到找到某种唯一指定窗口的方法。然后编码。

我强烈建议你看一下Swapypywinauto的页面。当涉及到UI自动化时,它们可以帮助你做一些很棒的事情。

相关问题 更多 >

    热门问题