用Python切换Windows

我会在前面说我对python很缺乏经验,我希望这意味着解决我的问题将是简单的。

我的程序将在另一个窗口中执行简单的操作,所以理想情况下,我希望我的脚本确保其他窗口最大化并处于活动状态,然后继续执行其余的命令 。 事实certificate,这比我预料的要困难得多。

我相当肯定,我可以用win32gui使用find_window并将其设置为前景来实现。 当我遇到以前的这个问题时,我想我已经find了我的解决scheme: Python窗口激活

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

– 用户定义find_window的方式只允许你select窗口的类名,这是我不知道也没有find的,因为它只是一个运行在Java中的游戏。 我似乎无法改变该行为特定windowname(我知道),因为它不是“默认参数”。

– 我不想列举窗口find它,因为我不知道如何工作。

使用find_window_wildcard写入该脚本已经设法使窗口前几次,但只有当窗口已经打开,它只能间歇地工作。

-set_foreground()需要一个input语句,不pipe我如何设置它,我总是给出一个错误,我可能有错误的元素数量或窗口上的无效句柄。

我知道我很愚蠢, 但是对这个问题的一个清晰而简明的解决scheme,或者至less是对find_window / getwindow语法的一个很好的解释,对于我自己和任何其他有这个问题的人来说都是天赐之物。

强烈建议你看一下Swapy和pywinauto的页面。 当谈到UI自动化时,他们可以帮助您做一些非常棒的事情。

用户定义find_window的方式只允许你通过窗口的类名选择

用户定义它的方式是将两个参数class_namewindow_name直接传递给win32gui.FindWindow (它只是调用Win32 API函数FindWindow )。 所以,只要做到这一点:

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

但即使这不是真的,你不需要使用他的find_window函数; 它应该是非常明显的如何自己调用win32gui.FindWindow

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

如果你想要一个很好的解释FindWindow / EnumWindows /等。 语法,你尝试看看他们的文档? 有什么你不明白的吗?

与此同时:

…窗口的类名,我不知道也找不到,因为它只是一个运行在Java中的游戏

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

我不想列举窗口找到它,因为我不知道如何工作。

只要用正则表达式调用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 ,并且不对回调函数中的值做任何事情,但可以看到另一个回答者是如何使用它来传递正则表达式的。)

与此同时:

使用find_window_wildcard因为它的脚本已经成功地把窗口放到前台几次,但只有当窗口已经打开,它只能间歇地工作。

首先,如果不存在的话,你不能把它放在前台。 你期望如何工作?

就间歇性的工作而言,我的猜测是有很多与你的通配符相匹配的窗口,而且程序只是随意挑选其中的一个。 这可能不是你想要的。 (它甚至可能是一个隐藏的窗口或东西,所以你不会看到任何事情发生。)

无论如何,你不需要使用find_window_wildcard ; 如果你知道确切的名字,使用它。 当然,它可能并不是唯一的(不管游戏的名字是什么,没有任何东西阻止你打开电子邮件或者使用相同标题的记事本窗口……顺便说一句,为什么你要先尝试类名),但至少它比一些不明确的通配符更可能是唯一的。

那么,如果这个类名不是唯一的(或者更糟的是它是一个特殊的“数字”类,比如一个普通对话窗口的#32770),那么这个窗口名也不是。 通过查看拥有的进程或模块(exe / dll)或父窗口,或者其他任何东西,你可能能够把事情缩小一点。 你必须通过win32gui和/或MSDN文档(上面链接)来查看可能的事情,然后通过反复试验(还记得Spy工具)来玩弄,直到找到某种方式来指定唯一的窗口。 然后编码起来。