Python win32gui SetAsForegroundWindow函数无法正常工作
我正在尝试编写一个通过搜索窗口标题来查找窗口的程序。找到窗口后,它将尝试将其移到最前面。我正在使用win32gui
API来实现这一目标。我能够使它大部分工作,但是由于某种原因,如果任务管理器在前面,它将无法工作。我有以下示例代码。
import win32gui, win32con
import re, traceback
from time import sleep
class cWindow:
def __init__(self):
self._hwnd = None
def BringToTop(self):
win32gui.BringWindowToTop(self._hwnd)
def SetAsForegroundWindow(self):
win32gui.SetForegroundWindow(self._hwnd)
def Maximize(self):
win32gui.ShowWindow(self._hwnd, win32con.SW_MAXIMIZE)
def setActWin(self):
win32gui.SetActiveWindow(self._hwnd)
def _window_enum_callback(self, hwnd, wildcard):
'''Pass to win32gui.EnumWindows() to check all the opened windows'''
if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
self._hwnd = hwnd
def find_window_wildcard(self, wildcard):
self._hwnd = None
win32gui.EnumWindows(self._window_enum_callback, wildcard)
def main():
sleep(5)
try:
wildcard = ".*Building Operation WorkStation.*"
cW = cWindow()
cW.find_window_wildcard(wildcard)
cW.Maximize()
cW.BringToTop()
cW.SetAsForegroundWindow()
except:
f = open("log.txt", "w")
f.write(traceback.format_exc())
print traceback.format_exc()
main()
我从多个在线来源整理而成。它似乎在大多数情况下都可以工作,但是对于某些窗口(例如任务管理器)来说,它有时会工作,但其余部分无法工作。当它无法正常工作时,我注意到的是应用程序图标闪烁黄色。是否有适当的方法来确保将我感兴趣的窗口设置为100%的前景?我不确定这是否相关,但是我正在使用Windows
7 Professional(32位)和Service Pack 1。
-
我找到了解决方案:如果是taskmanager,则将其杀死。我添加了一个方法
cWindow
:def kill_task_manager(self): # Here I use your method to find a window because of an accent in my french OS, # but you should use win32gui.FindWindow(None, 'Task Manager complete name'). wildcard = 'Gestionnaire des t.+ches de Windows' self.find_window_wildcard(wildcard) if self._hwnd: win32gui.PostMessage(self._hwnd, win32con.WM_CLOSE, 0, 0) # kill it sleep(0.5) # important to let time for the window to be closed
在之后调用此方法
cW = cWindow()
。另一个错误陷阱是防止出现以下情况中的异常
SetAsForegroundWindow
:error: (0, 'SetForegroundWindow', 'No error message is available')
只需在win32gui调用之前发送一个alt键:
# Add this import import win32com.client # Add this to __ini__ self.shell = win32com.client.Dispatch("WScript.Shell") # And SetAsForegroundWindow becomes def SetAsForegroundWindow(self): self.shell.SendKeys('%') win32gui.SetForegroundWindow(self._hwnd)
最后,如果我可以,不比较
!= None
,但是is not None
。更多pythonic;)这是完整的代码:
# coding: utf-8 import re, traceback import win32gui, win32con, win32com.client from time import sleep class cWindow: def __init__(self): self._hwnd = None self.shell = win32com.client.Dispatch("WScript.Shell") def BringToTop(self): win32gui.BringWindowToTop(self._hwnd) def SetAsForegroundWindow(self): self.shell.SendKeys('%') win32gui.SetForegroundWindow(self._hwnd) def Maximize(self): win32gui.ShowWindow(self._hwnd, win32con.SW_MAXIMIZE) def setActWin(self): win32gui.SetActiveWindow(self._hwnd) def _window_enum_callback(self, hwnd, wildcard): '''Pass to win32gui.EnumWindows() to check all the opened windows''' if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None: self._hwnd = hwnd def find_window_wildcard(self, wildcard): self._hwnd = None win32gui.EnumWindows(self._window_enum_callback, wildcard) def kill_task_manager(self): wildcard = 'Gestionnaire des t.+ches de Windows' self.find_window_wildcard(wildcard) if self._hwnd: win32gui.PostMessage(self._hwnd, win32con.WM_CLOSE, 0, 0) sleep(0.5) def main(): sleep(5) try: wildcard = ".*Building Operation WorkStation.*" cW = cWindow() cW.kill_task_manager() cW.find_window_wildcard(wildcard) cW.BringToTop() cW.Maximize() cW.SetAsForegroundWindow() except: f = open("log.txt", "w") f.write(traceback.format_exc()) print(traceback.format_exc()) if __name__ == '__main__': main()
资料来源:如何在Python和win32gui.SetActiveWindow()中使用win32gui关闭带有句柄的窗口错误:找不到指定的过程。