我将在前言中说我对python缺乏经验,我希望这意味着解决我的问题很简单。
我的程序将在另一个窗口中执行简单的操作,所以理想情况下我希望我的脚本确保在继续执行其余命令之前,此窗口最大化并处于活动状态。事实证明这比我预期的要困难得多。
我相当肯定我可以使用find_window并将其设置为前台,使用win32gui实现此目的。当我遇到上一个问题时,我以为我找到了解决方案: Python Window Activation
不幸的是,由于以下几个原因,我无法使用解决方案代码或操纵它来解决我的问题:
- 用户定义find_window的方式只允许您通过窗口的类名进行选择,我不知道也无法找到,因为它只是一个用Java运行的游戏。我似乎无法改变那条线为特定的windowname(我知道)工作,因为它不是“默认参数”。
- 我不想枚举窗口来查找它,因为我不确定它是如何工作的。
- 使用find_window_wildcard,因为它写入了该脚本已经设法将窗口带到前台几次,但只有当窗口已经打开时,它才会间歇性地工作。
-set_foreground()需要一个输入语句,无论我如何设置它,我总是会得到一个错误,我要么是元素数量错误,要么窗口上的句柄无效。
我知道我很蠢;但是这个问题的清晰简洁的解决方案或至少是find_window / getwindow语法的一个很好的解释对我自己和其他任何有这个问题的人来说都是天赐之物。
答案 0 :(得分:4)
答案 1 :(得分:1)
用户定义find_window的方式只允许您通过窗口的类名进行选择
用户定义它的方式是将两个参数class_name
和window_name
通过,不受影响地传递给win32gui.FindWindow
(后者只调用Win32 API函数{{3} })。所以,就这样做:
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附带的工具之一,或者您可以在网上找到的任何免费改进版本,例如FindWindow
,它可以让您指向一个窗口并为您提供标题和班级名称。
我不想枚举窗口来查找它,因为我不确定它是如何工作的。
只需使用正则表达式调用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工具),直到您找到某种方法来指定唯一的窗口。然后编码。