我有一个使用selenium自动化网页的python脚本,将焦点从需要用户输入的终端上移开。
python中是否有通过编程将焦点切换回终端的方法?
如果重要的话,我将在Windows 7的Windows命令提示符中运行我的程序,但是跨平台答案将是最有用的。
查看pywin32win32 API 的程序包绑定,我有以下内容:
pywin32
import win32console import win32gui from selenium import webdriver as wd d = wd.Firefox() win32gui.SetFocus(win32console.GetConsoleWindow()) win32gui.FlashWindow(win32console.GetConsoleWindow(), False) input('Should have focus: ')
SetFocus``pywintypes.error: (5, 'SetFocus', 'Access is denied.')由于Microsoft删除了从另一个应用程序获取焦点的功能而导致该错误。
SetFocus``pywintypes.error: (5, 'SetFocus', 'Access is denied.')
FlashWindow 似乎无能为力。
FlashWindow
这是我想出的似乎是可行的。
class WindowManager: def __init__(self): self._handle = None def _window_enum_callback( self, hwnd, wildcard ): if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None: self._handle = hwnd #CASE SENSITIVE def find_window_wildcard(self, wildcard): self._handle = None win32gui.EnumWindows(self._window_enum_callback, wildcard) def set_foreground(self): win32gui.ShowWindow(self._handle, win32con.SW_RESTORE) win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) win32gui.SetWindowPos(self._handle,win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW + win32con.SWP_NOMOVE + win32con.SWP_NOSIZE) shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('%') win32gui.SetForegroundWindow(self._handle) def find_and_set(self, search): self.find_window_wildcard(search) self.set_foreground()
然后找到一个窗口并将其激活,您可以…
w = WindowManager() w.find_and_set(".*cmd.exe*")
这是在python 2.7中,这也是我发现的一些链接,这些链接解释了为什么要切换活动窗口必须要花很多麻烦。