def GetMenuItemString(idx): hwnd = win32gui.FindWindow("#32768", None) MN_GETHMENU = 0x01E1 hmenu = win32gui.SendMessage(hwnd, MN_GETHMENU, 0, 0) mii, extra = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(hmenu, idx, True, mii) fType, fState, wID, hSubMenu, hbmpChecked, hbmpUnchecked,\ dwItemData, text, hbmpItem = win32gui_struct.UnpackMENUITEMINFO(mii) print text return text
def send_to_r(cmd): rid = win32gui.FindWindow("Rgui", None) if not rid: rid = win32gui.FindWindow("Rgui Workspace", None) if rid: clipboard.set_clipboard(cmd + "\n") mid = win32gui.GetMenu(rid) buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(mid, 1, True, buf) eid = win32gui_struct.UnpackMENUITEMINFO(buf).hSubMenu buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(eid, 1, True, buf) pid = win32gui_struct.UnpackMENUITEMINFO(buf).wID win32api.PostMessage(rid, win32con.WM_SETFOCUS, pid, 0) sublime.set_timeout( lambda: win32api.PostMessage(rid, win32con.WM_COMMAND, pid, 0), 50) clipboard.reset_clipboard()
def _MergeMenus(self, activate_state): # Merge the operations we support into the top-level menus. # NOTE: This function it *not* called each time the selection changes. # SVUIA_ACTIVATE_FOCUS really means "have a selection?" have_sel = activate_state == shellcon.SVUIA_ACTIVATE_FOCUS # only do "file" menu here, and only 1 item on it! mid = shellcon.FCIDM_MENU_FILE # Get the hmenu for the menu buf, extras = win32gui_struct.EmptyMENUITEMINFO(win32con.MIIM_SUBMENU) win32gui.GetMenuItemInfo(self.hmenu, mid, False, buf) data = win32gui_struct.UnpackMENUITEMINFO(buf) submenu = data[3] print("Do someting with the file menu!")
def send_to_r(cmd): rid = win32gui.FindWindow("Rgui Workspace", None) if rid: # mdi win32gui.EnumChildWindows(rid, child_window_callback, None) else: # sdi rid = win32gui.FindWindow("Rgui", "R Console (64-bit)") if not rid: rid = win32gui.FindWindow("Rgui", "R Console (32-bit)") if rid: win32gui.BringWindowToTop(rid) if rid: clipboard.set_clipboard(cmd + "\n") menuitems = win32gui.GetMenu(rid) buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(menuitems, 0, True, buf) if win32gui_struct.UnpackMENUITEMINFO(buf).text == "": editid = 2 else: editid = 1 buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(menuitems, editid, True, buf) editmenu = win32gui_struct.UnpackMENUITEMINFO(buf).hSubMenu buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(editmenu, 1, True, buf) pasteid = win32gui_struct.UnpackMENUITEMINFO(buf).wID win32api.PostMessage(rid, win32con.WM_SETFOCUS, pasteid, 0) sublime.set_timeout( lambda: win32api.PostMessage(rid, win32con.WM_COMMAND, pasteid, 0), 50) clipboard.reset_clipboard()
def _read_item(self): """Read the menu item info See https://msdn.microsoft.com/en-us/library/windows/desktop/ms647980.aspx for more information. """ item_info = MenuItemInfo() buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(self.menu.handle, self._index, True, buf) item_info.fType, item_info.fState, item_info.wID, item_info.hSubMenu, \ item_info.hbmpChecked, item_info.hbmpUnchecked, item_info.dwItemData, \ item_info.text, item_info.hbmpItem = win32gui_struct.UnpackMENUITEMINFO(buf) return item_info
def get_menu_item_txt(self, menu, idx): """ 获取当前句柄窗口所有子窗口的句柄与名字 :param menu: :param idx: :return: """ mii, extra = win32gui_struct.EmptyMENUITEMINFO( ) # 新建一个win32gui的空的结构体mii GetMenuItemInfo(menu, idx, True, mii) # 将子菜单内容获取到mii ftype, fstate, wid, hsubmenu, hbmpchecked, hbmpunchecked, \ dwitemdata, text, hbmpitem = win32gui_struct.UnpackMENUITEMINFO(mii) # 解包mii return text
def testEmptyMenuItemInfo(self): mii, extra = win32gui_struct.EmptyMENUITEMINFO() fType, fState, wID, hSubMenu, hbmpChecked, hbmpUnchecked, \ dwItemData, text, hbmpItem = win32gui_struct.UnpackMENUITEMINFO(mii) self.failUnlessEqual(fType, 0) self.failUnlessEqual(fState, 0) self.failUnlessEqual(wID, 0) self.failUnlessEqual(hSubMenu, 0) self.failUnlessEqual(hbmpChecked, 0) self.failUnlessEqual(hbmpUnchecked, 0) self.failUnlessEqual(dwItemData, 0) self.failUnlessEqual(hbmpItem, 0) # it's not clear if UnpackMENUITEMINFO() should ignore cch, instead # assuming it is a buffer size rather than 'current length' - but it # never has (and this gives us every \0 in the string), and actually # helps us test the unicode/str semantics. self.failUnlessEqual(text, '\0' * len(text))
def testEmptyMenuItemInfo(self): mii, extra = win32gui_struct.EmptyMENUITEMINFO() fType, fState, wID, hSubMenu, hbmpChecked, hbmpUnchecked, \ dwItemData, text, hbmpItem = win32gui_struct.UnpackMENUITEMINFO( mii) assert fType == 0 assert fState == 0 assert wID == 0 assert hSubMenu == 0 assert hbmpChecked == 0 assert hbmpUnchecked == 0 assert dwItemData == 0 assert hbmpItem == 0 # it's not clear if UnpackMENUITEMINFO() should ignore cch, instead # assuming it is a buffer size rather than 'current length' - but it # never has (and this gives us every \0 in the string), and actually # helps us test the unicode/str semantics. assert text == '\0' * len(text)
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 _read_item(self): """Read the menu item info See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/menus/menureference/menufunctions/getmenuiteminfo.asp for more information.""" item_info = MenuItemInfo() buf, extras = win32gui_struct.EmptyMENUITEMINFO() win32gui.GetMenuItemInfo(self.menu.handle, self.index, True, buf) item_info.fType, item_info.fState, item_info.wID, item_info.hSubMenu, item_info.hbmpChecked, \ item_info.hbmpUnchecked, item_info.dwItemData, item_info.text, item_info.hbmpItem = win32gui_struct.UnpackMENUITEMINFO(buf) if six.PY2: item_info.text = item_info.text.decode( locale.getpreferredencoding()) # OWNERDRAW case try to get string from BCMenu if item_info.fType & 256 and not item_info.text: mem = RemoteMemoryBlock(self.ctrl) address = item_info.dwItemData s = win32structures.LPWSTR() mem.Read(s, address) address = s s = ctypes.create_unicode_buffer(100) try: mem.Read(s, address) item_info.text = s.value except Exception: item_info.text = '!! non-supported owner drawn item !!' # TODO: look into Tkinter case del mem return item_info
#print(type(buf)) #print("buf 0 : ", buf[0]) print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") try: #print(type( menu )) for i in range( win32gui.GetMenuItemCount(menu) ): win32gui.GetMenuItemInfo( menu, i, True, buf) #win32gui.GetMenuInfo( menu, # buf ) #print( "menu :" , buf[0] ) _, rect = win32gui.GetMenuItemRect(hwnd, menu, i) #print( rect ) if win32gui.PtInRect( rect, pt ): print(win32gui_struct.UnpackMENUITEMINFO(buf)) except pywintypes.error : pass win32gui.DrawMenuBar(hwnd) #time.sleep(1) #print("menu count : ", win32gui.GetMenuItemCount(menu)) #print("layout:", win32gui.GetLayout()) #print("Message:", win32gui.GetMessage(hwnd, 0, 10)) time.sleep(2)