def connect_(self, **kwargs): "Connects to an already running process" connected = False if 'process' in kwargs: self.process = kwargs['process'] AssertValidProcess(self.process) connected = True elif 'handle' in kwargs: if not handleprops.iswindow(kwargs['handle']): message = "Invalid handle 0x%x passed to connect_()"% ( kwargs['handle']) raise RuntimeError(message) self.process = handleprops.processid(kwargs['handle']) connected = True elif 'path' in kwargs: self.process = process_from_module(kwargs['path']) connected = True elif kwargs: handle = findwindows.find_window(**kwargs) self.process = handleprops.processid(handle) connected = True if not connected: raise RuntimeError( "You must specify one of process, handle or path") return self
def connect_(self, **kwargs): "Connects to an already running process" connected = False if 'process' in kwargs: self.process = kwargs['process'] AssertValidProcess(self.process) connected = True elif 'handle' in kwargs: if not handleprops.iswindow(kwargs['handle']): message = "Invalid handle 0x%x passed to connect_()" % ( kwargs['handle']) raise RuntimeError(message) self.process = handleprops.processid(kwargs['handle']) connected = True elif 'path' in kwargs: self.process = process_from_module(kwargs['path']) connected = True elif kwargs: handle = findwindows.find_window(**kwargs) self.process = handleprops.processid(handle) connected = True if not connected: raise RuntimeError( "You must specify one of process, handle or path") return self
def find_windows( class_name=None, class_name_re=None, parent=None, process=None, title=None, title_re=None, top_level_only=True, visible_only=True, enabled_only=False, best_match=None, handle=None, ctrl_index=None, predicate_func=None, active_only=False, control_id=None, ): """Find windows based on criteria passed in Possible values are: * **class_name** Windows with this window class * **class_name_re** Windows whose class match this regular expression * **parent** Windows that are children of this * **process** Windows running in this process * **title** Windows with this Text * **title_re** Windows whose Text match this regular expression * **top_level_only** Top level windows only (default=True) * **visible_only** Visible windows only (default=True) * **enabled_only** Enabled windows only (default=True) * **best_match** Windows with a title similar to this * **handle** The handle of the window to return * **ctrl_index** The index of the child window to return * **active_only** Active windows only (default=False) * **control_id** Windows with this control id """ # allow a handle to be passed in # if it is present - just return it if handle is not None: return [handle] if top_level_only: # find the top level windows windows = enum_windows() # if we have been given a parent if parent: windows = [win for win in windows if handleprops.parent(win) == parent] # looking for child windows else: # if not given a parent look for all children of the desktop if not parent: parent = win32functions.GetDesktopWindow() # look for all children of that parent windows = enum_child_windows(parent) # if the ctrl_index has been specified then just return # that control if ctrl_index is not None: return [windows[ctrl_index]] if control_id is not None and windows: windows = [win for win in windows if handleprops.controlid(win) == control_id] if active_only: gui_info = win32structures.GUITHREADINFO() gui_info.cbSize = ctypes.sizeof(gui_info) # get all the active windows (not just the specified process) ret = win32functions.GetGUIThreadInfo(0, ctypes.byref(gui_info)) if not ret: raise ctypes.WinError() if gui_info.hwndActive in windows: windows = [gui_info.hwndActive] else: windows = [] if class_name is not None and windows: windows = [win for win in windows if class_name == handleprops.classname(win)] if class_name_re is not None and windows: class_name_regex = re.compile(class_name_re) windows = [win for win in windows if class_name_regex.match(handleprops.classname(win))] if process is not None and windows: windows = [win for win in windows if handleprops.processid(win) == process] if title is not None and windows: windows = [win for win in windows if title == handleprops.text(win)] elif title_re is not None and windows: title_regex = re.compile(title_re) windows = [win for win in windows if title_regex.match(handleprops.text(win))] if visible_only and windows: windows = [win for win in windows if handleprops.isvisible(win)] if enabled_only and windows: windows = [win for win in windows if handleprops.isenabled(win)] if best_match is not None and windows: wrapped_wins = [] for win in windows: try: wrapped_wins.append(controls.WrapHandle(win)) except controls.InvalidWindowHandle: # skip invalid handles - they have dissapeared # since the list of windows was retrieved pass windows = findbestmatch.find_best_control_matches(best_match, wrapped_wins) # convert window back to handle windows = [win.handle for win in windows] if predicate_func is not None and windows: windows = [win for win in windows if predicate_func(win)] return windows
def find_windows(class_name = None, class_name_re = None, parent = None, process = None, title = None, title_re = None, top_level_only = True, visible_only = True, enabled_only = False, best_match = None, handle = None, ctrl_index = None, predicate_func = None, active_only = False, control_id = None, ): """Find windows based on criteria passed in Possible values are: * **class_name** Windows with this window class * **class_name_re** Windows whose class match this regular expression * **parent** Windows that are children of this * **process** Windows running in this process * **title** Windows with this Text * **title_re** Windows whose Text match this regular expression * **top_level_only** Top level windows only (default=True) * **visible_only** Visible windows only (default=True) * **enabled_only** Enabled windows only (default=True) * **best_match** Windows with a title similar to this * **handle** The handle of the window to return * **ctrl_index** The index of the child window to return * **active_only** Active windows only (default=False) * **control_id** Windows with this control id """ # allow a handle to be passed in # if it is present - just return it if handle is not None: return [handle, ] if top_level_only: # find the top level windows windows = enum_windows() # if we have been given a parent if parent: windows = [win for win in windows if handleprops.parent(win) == parent] # looking for child windows else: # if not given a parent look for all children of the desktop if not parent: parent = win32functions.GetDesktopWindow() # look for all children of that parent windows = enum_child_windows(parent) # if the ctrl_index has been specified then just return # that control if ctrl_index is not None: return [windows[ctrl_index]] if control_id is not None and windows: windows = [win for win in windows if handleprops.controlid(win) == control_id] if active_only: gui_info = win32structures.GUITHREADINFO() gui_info.cbSize = ctypes.sizeof(gui_info) # get all the active windows (not just the specified process) ret = win32functions.GetGUIThreadInfo(0, ctypes.byref(gui_info)) if not ret: raise ctypes.WinError() if gui_info.hwndActive in windows: windows = [gui_info.hwndActive] else: windows = [] if class_name is not None and windows: windows = [win for win in windows if class_name == handleprops.classname(win)] if class_name_re is not None and windows: class_name_regex = re.compile(class_name_re) windows = [win for win in windows if class_name_regex.match(handleprops.classname(win))] if process is not None and windows: windows = [win for win in windows if handleprops.processid(win) == process] if title is not None and windows: windows = [win for win in windows if title == handleprops.text(win)] elif title_re is not None and windows: title_regex = re.compile(title_re) windows = [win for win in windows if title_regex.match(handleprops.text(win))] if visible_only and windows: windows = [win for win in windows if handleprops.isvisible(win)] if enabled_only and windows: windows = [win for win in windows if handleprops.isenabled(win)] if best_match is not None and windows: wrapped_wins = [] for win in windows: try: wrapped_wins.append(controls.WrapHandle(win)) except controls.InvalidWindowHandle: # skip invalid handles - they have dissapeared # since the list of windows was retrieved pass windows = findbestmatch.find_best_control_matches( best_match, wrapped_wins) # convert window back to handle windows = [win.handle for win in windows] if predicate_func is not None and windows: windows = [win for win in windows if predicate_func(win)] return windows