<blockquote>
<p>The way that user had defined find_window only allows you to choose by the classname of the window</p>
</blockquote>
<p>用户定义它的方式是将这两个参数<code>class_name</code>和<code>window_name</code>传递给<a href="http://docs.activestate.com/activepython/2.5/pywin32/win32gui__FindWindow_meth.html" rel="nofollow">^{<cd3>}</a>(后者反过来只调用Win32 API函数<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx" rel="nofollow">^{<cd4>}</a>)。所以,就这样做:</p>
<pre><code>windowmgr.find_window(None, 'My Window Name')
</code></pre>
<p>但即使这不是真的,也不需要使用他的<code>find_window</code>函数;很明显,如何调用<code>win32gui.FindWindow</code>自己:</p>
<pre><code>hwnd = win32gui.FindWindow(None, 'My Window Name')
</code></pre>
<p>如果你想对<code>FindWindow</code>/<code>EnumWindows</code>/etc.语法有一个很好的解释,你有没有试着查看它们的文档?有什么你不明白的吗?</p>
<p>同时:</p>
<blockquote>
<p>… 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</p>
</blockquote>
<p>它在Java中运行有什么区别?你可以枚举窗口并打印出他们的类名,无论它们是用C++、java、.net、python或其他东西编写的。或者使用Visual Studio/VS Express附带的工具,或者任何你可以在网上找到的免费改进版本,比如<a href="http://www.codeproject.com/Articles/1698/MS-Spy-style-Window-Finder" rel="nofollow">MS Spy++</a>,它可以让你指向一个窗口并给出标题和类名。</p>
<blockquote>
<p>I don't want to enumerate the windows to find it as I'm not sure how that would work.</p>
</blockquote>
<p>只要用正则表达式调用<code>windowmgr.find_window_wildcard(wildcard)</code>,它就会枚举窗口并将它们的标题与该正则表达式进行比较。</p>
<p>如果要编写自己的代码来完成此任务,只需编写如下函数:</p>
<pre><code>def my_callback(hwnd, cookie):
</code></pre>
<p>现在,当你这样做时:</p>
<pre><code>win32gui.EnumWindows(my_callback, some_cookie)
</code></pre>
<p>…它将在每个窗口调用一次您的<code>my_callback</code>函数,其中<code>hwnd</code>是窗口(您可以传递给<code>win32gui</code>函数,例如<code>GetWindowText</code>),而<code>cookie</code>是您传入的<code>some_cookie</code>值。(如果不需要传入任何内容,只需传入<code>None</code>,并且不使用回调函数中的值。但您可以看到另一个应答器是如何使用它来传递正则表达式的。)</p>
<p>同时:</p>
<blockquote>
<p>using <code>find_window_wildcard</code> 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.</p>
</blockquote>
<p>首先,如果窗口不存在,就不能将其带到前台。你认为这会怎样?</p>
<p>就间歇工作而言,我的猜测是有很多窗口与您的通配符匹配,程序将任意选择其中一个窗口。可能不是你想要的那个。(它甚至可能是一个隐藏的窗口或其他东西,所以你根本看不到任何事情发生。)</p>
<p>无论如何,您不需要使用<code>find_window_wildcard</code>;如果您知道确切的名称,请使用该名称。当然,它可能仍然不是唯一的(无论游戏的名称是什么,没有什么可以阻止你打开一封电子邮件或一个记事本窗口的相同标题…顺便说一句,这就是为什么你想先尝试类名),但至少它比一些未指定的通配符更有可能是唯一的。</p>
<p>那么,如果类名不是唯一的(或者,更糟的是,它是一个特殊的“number”类,比如32770用于一般的对话框窗口),而窗口名也不是唯一的呢?您可以通过查看所属进程或模块(exe/dll)或父窗口或其他任何内容来更好地缩小范围。您必须查看<code>win32gui</code>和/或MSDN文档(链接在上面)以查找可能要尝试的内容,并通过反复尝试(也要记住Spy工具),直到找到某种唯一指定窗口的方法。然后编码。</p>