IExplorer & Outlook: ToolbarWindow32 + Menü



  • Hallo!

    Ich versuche mit einer Funktion herauszufinden, ob z.b. beim IExplorer unter "Ansicht" bei "Statusanzeige" ein Haken vorhanden ist oder nicht.

    Ich bekomme nicht die richtigen "Handles" um die Funktion "GetMenuState" aufzurufen und dort "MF_CHECKED" zu prüfen.

    In welcher Klasse ist das Menü versteckt? Wie kommt man an den Punkt z.b. "Statusanzeige" (mit Prüfung ob es "checked" ist oder nicht)?

    Das es "irgendwie" mit "FindWindow" gehen muss, weiß ich auch.
    Bei google gibt es nur wenig darüber.

    Ich bin für jeden Tipp dankbar!

    Viele Grüße



  • In einer Toolbar - hast du schon Spy++ bzw. WinSpector bemüht?



  • Ja, habe ich.

    Ich wußte / weiß halt nur gar nicht, wo sich da das Menü verstecken sollte. Es ist ja nicht als Klasse zu sehen. Ich werde mal versuchen mit der "ToolbarWindow32"-HWND einen Menü-Handle per "GetMenu" zu bekommen.

    Danke schonmal



  • Hallo!

    Ich habe mich nun an allem Versucht. Ich habe auch den richtigen Handle. Das zeigt sich daran, dass bei "ShowWindow(HWND, SW_HIDE)" das "Datei, Bearbeiten, Ansicht,usw."- Menü dann verschwindet. Jedoch schlägt "GetMenu" mit dem Handle der gleichen Toolbar fehl.

    Hier mein Code:

    HWND t1,t2,t3,t4;
    HMENU hMainMenu; 
    t1 = FindWindowEx(hwnd, NULL, "SizableRebar", NULL);
    t2 = FindWindowEx(t1, NULL, "ReBarWindow32", NULL);
    t3 = FindWindowEx(t2, NULL, "ToolbarWindow32", NULL);
    t4 = FindWindowEx(t2, t3, "ToolbarWindow32", NULL);
    
    hMainMenu = GetMenu( t4 ); // gibt bei mir leider NULL zurück
    ShowWindow(t4, SW_HIDE); // Controlle ob richtiges Fenster
    if( hMainMenu != NULL)
    MessageBox(hwnd,"state_ok","Info",MB_OK);
    

    Hat jemand Vorschläge?
    Mehr Handles gibt es bei Spy++ unter ReBarWindow32 auch nicht.



  • Ich nehmen mal an, dass das direkt Buttons in der Toolbar sind - siehe auch: Using Toolbar Controls > Handling Drop-down Buttons 🙂



  • Vielen Dank für den Hinweis! Das wußte ich noch nicht. Ist wissenswert, da ich so aufhören kann, in irgendwelchen "SubMenüs" rumzusuchen.

    for (i = 0;i<=16777215;i++)
    			{
    				hMainMenu = GetMenu( (HWND)i );
    				if(hMainMenu!=NULL)
    				{
    					if((menu_state=GetMenuState( hMainMenu, 40368, MF_BYCOMMAND ))>=0)
    					{
    						if(menu_state & MF_CHECKED)
    						{
    							f1=fopen("f:\log.txt","wr+");
    							fprintf(f1,"%X %X %X",hwnd,i,hMainMenu);
    							fclose(f1);
    							//MessageBox(hwnd,"Sub1 gefunden!","Info",MB_OK);
    						}
    					}
    					menuInfo.cbSize = sizeof(MENUITEMINFO);
    					menuInfo.fMask = MIIM_SUBMENU;
    					GetMenuItemInfo( hMainMenu, 40019, FALSE, &menuInfo );
    					hSubMenu = menuInfo.hSubMenu;
    					if(hSubMenu!= NULL)
    					{
    						if((menu_state=GetMenuState( hSubMenu, 40368, MF_BYCOMMAND ))>=0)
    						{
    							if(menu_state & MF_CHECKED)
    							{
    								//MessageBox(hwnd,"Sub2 gefunden!","Info",MB_OK);
    								//break;
    								f1=fopen("f:\log2.txt","wr+");
    								fprintf(f1,"%X %X %X %X",hwnd,i,hMainMenu,hSubMenu);
    								fclose(f1);	
    							}
    						}
    					}
    				}
    			}
    

    Hier habe ich mal alle Windows-Handles abgesucht und das Ergebnis in eine Datei gespeichert. Jedoch hat auch dies nicht geklappt.

    Weiß jemand, wie ich nun an das entsprechende Menü komme, welches erscheint, wenn ich auf z.b. den "Tools" bzw. "Extras"-Button drücke?
    Oder wie ich zumindest prüfen kann, ob eines der Optionen dort einen Haken ("checked") hat?

    Jede Idee ist willkommen!



  • ..bis zum Ende gelesen erwischt man dies auf der HTML-Seite:

    "It then retrieves the pop-up menu from a menu resource by using the GetSubMenu function and calls the TrackPopupMenuEx function to display the menu."

    Gut...jetzt muss man also nur noch dies umsetzen:

    hMenuLoaded = LoadMenu(g_hinst, MAKEINTRESOURCE(IDR_POPUP)); 
             hPopupMenu = GetSubMenu(LoadMenu(g_hinst,
                MAKEINTRESOURCE(IDR_POPUP)),0);
    

    Jedoch frage ich mich an dieser Stelle, ob der Wert (ob "checked" oder nicht) einer "Option" im Menü nun auch vor dem Öffnen des Popup-Menüs im Menü gespeichert ist, oder nicht. Ich meine z.b. wenn die Option "Statusleiste" in der Recource prinzipiell ausgeschaltet ist, man es jedoch angeschaltet hat, so würde der obige Code zwar "not checked" ergeben, aber es wäre doch aktiviert, da der IExplorer dies erst ändert, wenn er das Popup-Menü öffnet, oder?

    Versteht jemand was ich meine? 😕

    Im Endeffekt müsste ich also nicht versuchen zu gucken, ob der Menüpunkt "checked" oder nicht ist, sondern zu gucken was für ein Wert in der Registry / Ini-Datei / Variable steht, oder hat jemand eine andere Idee an die Werte von den Menüs der Buttons der ToolbarWindow32 zu kommen? 😃



  • Schau dir mal den Resource Hacker an. Die Menüs befinden sich aber nicht in der OEMIG50.EXE, sondern in MSOERES.DLL - damit solltest du dann eigentlich an die IDs kommen. Allerdings befürchte ich, dass du den Status so nicht richtig abfragen kannst - aber einfach mal ausprobieren 😉



  • Ansonsten kannst du mal versuchen mit Regmon bzw. Filemon zu schauen, wo diese Information abgespeichert wird - ist allerdings etwas mühsam 🤡



  • Ja, genau meine Befürchtung, was das Abfragen angeht.
    Damit kann man höchstens die Standart-Einstellungen abfragen, denke ich.

    Fakt ist: Ich hätte mir viel Arbeit sparen können.

    Es gibt da immer den schönen guten Registry-Key für jede Option bei den Menüs. (IE-Menüs)

    Damit klappt's jetzt. Ich habe den REG-Key gefunden.

    Die Recource-ID's hatte ich auch schon, aber das lasse ich lieber..

    Danke nochmal


Anmelden zum Antworten