def create_menu(self, menu, menu_options): index = 0 for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) self.menu_item_map[index] = (option_icon, option_text) if option_id in self.menu_actions_by_id: if option_icon: item, extras = win32gui_struct.PackMENUITEMINFO( fType=win32con.MFT_OWNERDRAW, dwItemData=index, wID=option_id) else: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, wID=option_id) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) if option_icon: item, extras = win32gui_struct.PackMENUITEMINFO( fType=win32con.MFT_OWNERDRAW, dwItemData=index, wID=option_id, hSubMenu=submenu) else: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, wID=option_id, hSubMenu=submenu) index = index + 1 win32gui.InsertMenuItem(menu, 0, 1, item)
def _create_menu(self, menu, menu_options): """Generate the popup menu just before drawing. This is needed as it recursively runs on submenus. """ for menu_option in menu_options[::-1]: if menu_option.get('hidden', False): continue text = menu_option.get('name', 'Option') icon = menu_option.get('icon', None) action = menu_option.get('action', None) id = menu_option.get('_id') #Set icon if icon: try: icon = self._set_icon_menu(icon) except pywintypes.error: icon = None #Add menu item if id in self.menu_actions_by_id or action is None: item, extras = win32gui_struct.PackMENUITEMINFO(text=text, hbmpItem=icon, wID=id) win32gui.InsertMenuItem(menu, 0, 1, item) #Add submenu else: submenu = win32gui.CreatePopupMenu() self._create_menu(submenu, action) item, extras = win32gui_struct.PackMENUITEMINFO( text=text, hbmpItem=icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, menu, menu_options): for option_text, option_icon, option_Checked, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) item_state = None if option_Checked is True: item_state = win32con.MFS_CHECKED if option_id in self.menu_actions_by_id: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, fState=item_state, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item) if option_id not in self.__menu_extra: self.__menu_extra.setdefault(option_id, extras) else: self.__menu_extra[option_id] = extras else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, fState=item_state, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item) if option_id not in self.__menu_extra: self.__menu_extra.setdefault(option_id, extras) else: self.__menu_extra[option_id] = extras
def create_menu(self, menu, menu_options): toggles = self.state.menu_states() for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) if option_id in self.menu_actions_by_id: state = 0 try: if toggles[option_text]: state = 8 except KeyError: pass item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, wID=option_id, fState=state) win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, menu, menopts): # Inserts all items into the popup (again, recursive) for opt in menopts: if opt[1] != None: opt_icon = opt[1].get() else: opt_icon = None mi_fstate = 0 mi_ftype = 0 if opt[3]["disabled"]: mi_fstate = mi_fstate | win32con.MFS_DISABLED if opt[3]["highlight"]: mi_fstate = mi_fstate | win32con.MFS_HILITE if opt[3]["separator"]: mi_ftype = mi_ftype | win32con.MFT_SEPARATOR if type(opt[2]) == type([]): submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, opt[2]) item, extras = win32gui_struct.PackMENUITEMINFO( text=opt[0].get(), hbmpItem=opt_icon, hSubMenu=submenu, fState=mi_fstate, fType=mi_ftype, wID=opt[-1]) else: item, extras = win32gui_struct.PackMENUITEMINFO( text=opt[0].get(), hbmpItem=opt_icon, fState=mi_fstate, fType=mi_ftype, wID=opt[-1]) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, menu, menu_options): for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: # has icon if not callable(option_icon): option_icon = self.prep_menu_icon(option_icon) if option_text == "-": # separator win32gui.InsertMenu(menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) elif option_id in self.menu_actions_by_id: # normal item checked = False if callable(option_icon): # checkbox item checked = option_icon() option_icon = None # no icon if checked: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, fState=win32con.MFS_CHECKED, wID=option_id) else: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item) else: # submenu submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def get_popup(self): menu = win32gui.CreatePopupMenu() (item, _) = win32gui_struct.PackMENUITEMINFO(text=u'Quit', wID=self.IDI_QUIT) win32gui.InsertMenuItem(menu, 0, 1, item) win32gui.SetMenuDefaultItem(menu, 0, self.IDI_QUIT) (item, _) = win32gui_struct.PackMENUITEMINFO(text=u'Test', wID=123) win32gui.InsertMenuItem(menu, 0, 1, item) return menu
def create_menu(self, menu, menu_options): for opt_text, opt_icon, opt_action, opt_id in menu_options[::-1]: if opt_icon: opt_icon = self.prep_menu_icon(opt_icon) if opt_id in self.menu_actions_by_id: item, extras = win32gui_struct.PackMENUITEMINFO(text=opt_text, hbmpItem=opt_icon, wID=opt_id) win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, opt_action) item, extras = win32gui_struct.PackMENUITEMINFO(text=opt_text, hbmpItem=opt_icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, parent_menu, menu_options): """ Create Menus """ for key, (name, action) in menu_options.iteritems(): # If action is dict, Create sub menu if isinstance(action, dict): submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, action) item, _ = win32gui_struct.PackMENUITEMINFO(text=name, hSubMenu=submenu) win32gui.InsertMenuItem(parent_menu, 0, 1, item) # Else, create menu entry else: item, _ = win32gui_struct.PackMENUITEMINFO(text=name, wID=key) win32gui.InsertMenuItem(parent_menu, 0, 1, item)
def create_menu(self, menu, menu_options): index = 0 for option_text, option_icon, option_action, option_checked, option_id in menu_options[:: -1]: menuiteminfo = dict(text=option_text, wID=option_id) menu_checked = self.menu_actions_by_id[option_id][1] if menu_checked is not None: checkable_menu = menu if menu_checked: menuiteminfo.update(dict(fState=win32con.MFS_CHECKED)) else: checkable_menu = None self.menu_actions_by_id[option_id] = ( self.menu_actions_by_id[option_id][0], menu_checked, checkable_menu) if option_icon: option_icon = self.prep_menu_icon(option_icon) self.menu_item_map[index] = (option_icon, None) menuiteminfo.update( dict(hbmpItem=win32con.HBMMENU_CALLBACK, dwItemData=index)) if option_id not in self.menu_actions_by_id: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) menuiteminfo.update(dict(hSubMenu=submenu)) item, extras = win32gui_struct.PackMENUITEMINFO(**menuiteminfo) if option_icon: index += 1 self.log.debug('id={} menu={} {}'.format( option_id, menu, self.menu_actions_by_id[option_id])) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self): menu = win32gui.CreatePopupMenu() item, extras = win32gui_struct.PackMENUITEMINFO( text = self.app_state.gettext('Close'), hbmpItem=win32con.HBMMENU_MBAR_CLOSE, wID=EXIT_COMMAND ) win32gui.InsertMenuItem( menu, 0, 1, item ) win32gui.SetMenuDefaultItem( menu, EXIT_COMMAND, 0 ) item, extras = win32gui_struct.PackMENUITEMINFO( text = self.app_state.gettext('Open'), hbmpChecked = None, hbmpUnchecked = None, wID=OPEN_COMMAND ) win32gui.InsertMenuItem( menu, 0, 1, item ) win32gui.SetForegroundWindow(self.window_id) x, y = win32gui.GetCursorPos() win32gui.TrackPopupMenu( menu, win32con.TPM_LEFTALIGN, x, y, 0, self.window_id, None ) win32gui.PostMessage( self.window_id, win32con.WM_NULL, 0, 0 )
def create_menu(self, menu): # option_icon = self.prep_menu_icon(option_icon) item, extras = win32gui_struct.PackMENUITEMINFO( text=base.STR_EXIT, hbmpItem=None, wID=_ID_QUIT) win32gui.InsertMenuItem(menu, 0, 1, item) win32gui.InsertMenu(menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) win32gui.InsertMenu(menu, 0, (win32con.MF_POPUP | win32con.MF_BYPOSITION), self.notices_menu, base.STR_NOTICES_MENU) win32gui.InsertMenu(menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) win32gui.InsertMenu(menu, 0, win32con.MF_POPUP | win32con.MF_BYPOSITION, self.status_menu, base.STR_STATUS_MENU) win32gui.InsertMenu(menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) # item, extras = win32gui_struct.PackMENUITEMINFO( # text=STR_OPEN_CONSOLE, # hbmpItem=None, # wID=_ID_OPEN_CONSOLE) # win32gui.InsertMenuItem(menu, 0, 1, item) item, extras = win32gui_struct.PackMENUITEMINFO( text=base.STR_OPEN_FOLDER, hbmpItem=None, wID=_ID_OPEN_FOLDER) win32gui.InsertMenuItem(menu, 0, 1, item) item, extras = win32gui_struct.PackMENUITEMINFO( text=base.STR_OPEN_WEBFRONT, hbmpItem=None, wID=_ID_OPEN_WEBFRONT) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self): '''Create context menu''' if self.MENU is not None: return self.MENU = win32gui.CreatePopupMenu() # Add menu items # Insert backwards # https://msdn.microsoft.com/en-us/library/windows/desktop/ms647988(v=vs.85).aspx # Quit win32gui.InsertMenuItem( self.MENU, 0, 1, win32gui_struct.PackMENUITEMINFO(text='Quit', wID=0)[0]) # App name win32gui.InsertMenuItem( self.MENU, 0, 1, win32gui_struct.PackMENUITEMINFO(text=self.APP_NAME, wID=0, fState=win32con.MFS_DISABLED)[0])
def addNewNotice(self, notice, pop_last=False): self.notice_index = (self.notice_index + 1) % base.NUM_OF_NOTICES item, extras = win32gui_struct.PackMENUITEMINFO( text=notice.title, hbmpItem=None, wID=_ID_NOTICE + (self.notice_index % base.NUM_OF_NOTICES)) win32gui.InsertMenuItem(self.notices_menu, 0, 1, item) if pop_last: win32gui.RemoveMenu(self.notices_menu, base.NUM_OF_NOTICES, win32con.MF_BYPOSITION)
def update_status_menu(self, user_status): for i, s in enumerate(base.status.STRINGS): fstate = 0 if user_status == i: fstate = win32con.MFS_CHECKED item, extras = win32gui_struct.PackMENUITEMINFO( text=base.status.STRINGS[i], hbmpItem=None, fState=fstate, wID=_ID_STATUS_AVAILABLE + i) win32gui.SetMenuItemInfo(self.status_menu, i, 1, item)
def create_menu(self, menu, menu_options): if DEBUG: print(sys._getframe(0).f_code.co_name) for option_text, option_icon, option_action, option_id in menu_options[::-1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) if option_id in self.menu_actions_by_id: item, extras = win32gui_struct.PackMENUITEMINFO(text=option_text, hbmpItem=option_icon, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO(text=option_text, hbmpItem=option_icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, menu, menu_options): for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) fstate = win32con.MF_BYCOMMAND if option_id in self.menu_actions_by_id: if option_action is None: fstate |= win32con.MF_GRAYED item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, fState=fstate, hbmpItem=option_icon, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, hSubMenu=submenu) win32gui.InsertMenuItem(menu, 0, 1, item)
def create_menu(self, menu, menu_options): for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) if option_text == "-": win32gui.InsertMenu(menu, 0, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) else: item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item)
def _notifyCallback(self, hwnd, msg, wparam, lparam): if not lparam in [ win32con.WM_LBUTTONDBLCLK, win32con.WM_RBUTTONUP, win32con.WM_LBUTTONUP ]: return hMenu = win32gui.CreatePopupMenu() self._callbacks.clear() items = self._items() if callable(self._items) else self._items wId = 1023 for txt, bmp, checked, callback in items: if checked is None: item, _ = win32gui_struct.PackMENUITEMINFO(text=str(txt), hbmpItem=bmp, wID=wId) else: item, _ = win32gui_struct.PackMENUITEMINFO( text=str(txt), hbmpItem=bmp, wID=wId, fState=win32con.MFS_CHECKED if checked else win32con.MFS_UNCHECKED) win32gui.InsertMenuItem(hMenu, 0, 1, item) self._callbacks[wId] = callback wId += 1 pos = win32gui.GetCursorPos() try: win32gui.SetForegroundWindow(hwnd) win32gui.TrackPopupMenu(hMenu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, hwnd, None) win32gui.PostMessage(hwnd, win32con.WM_NULL, 0, 0) except: pass win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
def create_menu(self, menu, menu_options): for menu_option in menu_options[::-1]: if isinstance(menu_option.icon, str): menu_option.icon = self.prep_menu_icon(menu_option.icon) if isinstance(menu_option, TraySubmenu): submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, menu_option.items) item, extras = win32gui_struct.PackMENUITEMINFO( text=menu_option.text, hbmpItem=menu_option.icon, hSubMenu=submenu, fState=menu_option.style) win32gui.InsertMenuItem(menu, 0, 1, item) elif isinstance(menu_option, TrayItem): item, extras = win32gui_struct.PackMENUITEMINFO( text=menu_option.text, hbmpItem=menu_option.icon, wID=menu_option._next_action_id, fState=menu_option.style, fType=menu_option.type) win32gui.InsertMenuItem(menu, 0, 1, item)
def _create_status_menu(self): menu = win32gui.CreateMenu() for i, s in enumerate(base.status.STRINGS): fstate = 0 if self.shell.user_status == i: fstate = win32con.MFS_CHECKED item, extras = win32gui_struct.PackMENUITEMINFO( text=base.status.STRINGS[i], hbmpItem=None, fState=fstate, wID=_ID_STATUS_AVAILABLE + i) win32gui.InsertMenuItem(menu, i, 1, item) self.status_menu = menu return self.status_menu
def _testPackUnpack(self, text): vals = dict(fType=win32con.MFT_MENUBARBREAK, fState=win32con.MFS_CHECKED, wID=123, hSubMenu=1234, hbmpChecked=12345, hbmpUnchecked=123456, dwItemData=1234567, text=text, hbmpItem=321) mii, extras = win32gui_struct.PackMENUITEMINFO(**vals) fType, fState, wID, hSubMenu, hbmpChecked, hbmpUnchecked, \ dwItemData, text, hbmpItem = win32gui_struct.UnpackMENUITEMINFO(mii) self.assertDictEquals(vals, fType=fType, fState=fState, wID=wID, hSubMenu=hSubMenu, hbmpChecked=hbmpChecked, hbmpUnchecked=hbmpUnchecked, dwItemData=dwItemData, text=text, hbmpItem=hbmpItem)
def show_menu(self): menu = win32gui.CreatePopupMenu() count = 0 for count, (option_text, option_id) in enumerate(self.menu_entries): win32gui.AppendMenu( menu, win32con.MF_STRING | win32con.MF_GRAYED | win32con.MF_DISABLED, option_id, option_text) win32gui.InsertMenu(menu, count + 1, win32con.MF_BYPOSITION, win32con.MF_SEPARATOR, None) win32gui.InsertMenuItem( menu, count + 2, 1, win32gui_struct.PackMENUITEMINFO( text="Quit", wID=0, hbmpItem=win32con.HBMMENU_MBAR_CLOSE)[0]) pos = win32gui.GetCursorPos() # See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp win32gui.SetForegroundWindow(self.hwnd) win32gui.TrackPopupMenu(menu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, self.hwnd, None) win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0)
def add_item_to_menu(self, *args, **kwargs): menu = args[0] item, extras = win32gui_struct.PackMENUITEMINFO(**kwargs) win32gui.InsertMenuItem(menu, self.menu_counters[menu], 1, item) self.menu_counters[menu] += 1
def create_menu(self, menu, menu_options): if len(menu_options) > 9: if recorder.mode != "Record": menu_options[0][0] = "Start recording\t\tCTRL+ALT+R" menu_options[0][1] = icon_record else: menu_options[0][0] = "Stop recording\t\tCTRL+ALT+R" menu_options[0][1] = icon_stop if recorder.mode == "Play": menu_options[1][0] = "Wait end of replay" # disabled menu_options[1][1] = icon_stop else: menu_options[1][0] = "Start replaying clipboard" menu_options[1][1] = icon_play if not recorder.mode == "Info": menu_options[2][ 0] = "Start displaying element information\tCTRL+SHIFT+D" menu_options[2][1] = icon_search else: menu_options[2][ 0] = "Stop displaying element information\tCTRL+SHIFT+D" menu_options[2][1] = icon_stop if not recorder.smart_mode: menu_options[3][0] = "Start Smart mode\t\tCTRL+ALT+S" menu_options[3][1] = icon_light_on else: menu_options[3][0] = "Stop Smart mode\t\tCTRL+ALT+S" menu_options[3][1] = icon_stop if not recorder.relative_coordinate_mode: menu_options[6][2][0][1] = icon_cross else: menu_options[6][2][0][1] = icon_check if not recorder.process_menu_click_mode: menu_options[6][2][1][1] = icon_cross else: menu_options[6][2][1][1] = icon_check for option_text, option_icon, option_action, option_id in menu_options[:: -1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) if option_id in self.menu_actions_by_id: item, _ = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, wID=option_id) if option_text == '- - - - - -': win32gui.InsertMenu( menu, 0, win32con.MF_SEPARATOR | win32con.MF_BYPOSITION, 0, None) else: win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, _ = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, hSubMenu=submenu) if option_text == '- - - - - -': win32gui.InsertMenu( menu, 0, win32con.MF_SEPARATOR | win32con.MF_BYPOSITION, 0, None) else: win32gui.InsertMenuItem(menu, 0, 1, item)