TrackPopupMenu Portierung...



  • Ich habe vor langer Zeit ein Programm unter NT geschrieben das ich momentan versuche für Windows 2003 Server wieder lauffähig zu machen. Jedoch scheiter ich schon an einer Kleinigkeit weiß jedoch überhaupt nicht weiter.

    LRESULT TrayWindow::OnTrayNotification(WPARAM wParam, LPARAM lParam)
    {
    	CMenu Popup; POINT pt;
    	CString sPath = this->szRegPath;
    
    	switch(lParam)
    	{
    	case WM_RBUTTONUP:
    			// Menü anzeigen
    			GetCursorPos( &pt );
    			SetForegroundWindow();
    			this->InitialMenu( true );
    
    			if(this->hMenu.m_hMenu != NULL ) 
    				this->hMenu.TrackPopupMenu( TPM_LEFTALIGN| TPM_RIGHTBUTTON , pt.x, pt.y, GetActiveWindow(), NULL); 
    
    			PostMessage( WM_NULL, 0, 0 );
    		break;
    
    	case WM_LBUTTONDBLCLK:
    			this->DeleteTray();
    			exit(1);
    		break;
    	}
    
      return 0;
    }
    

    dies Funktioniert unter NT einwandfrei, jedoch nicht unter 2003. Ich habe bereits festgestellt das das SetForegroundWindow() aus Sicherhheitsgründen unter 2003 weggelassen werden muss, das Problem ist aber dann das das Menü nicht angezeigt wird.

    Hat jemand eine Lösung?



  • Ich mache das immer so.

    LONG serverDlg::OnTrayMessage(WPARAM wparam, LPARAM lparam)
    {   // The tray icon sent us a message.  Let's see what it is
        switch (lparam)
        {
    		case WM_RBUTTONDOWN:
    			{// The user clicked the right mouse button.
    				// Let's give them a menu so they can start/stop   
    				// the animation.   
    				CMenu oMenu;
    				if (oMenu.LoadMenu(IDR_MENU1))        
    				{
    					CMenu* pPopup = oMenu.GetSubMenu(0);
    					ASSERT(pPopup != NULL);
    					CPoint oPoint;
    					// Figure out where the mouse is so we
    					// can display the menu near it.
    					GetCursorPos(&oPoint);
    					SetForegroundWindow();
    					pPopup->TrackPopupMenu(
    						TPM_LEFTALIGN | TPM_RIGHTBUTTON,
    						oPoint.x, oPoint.y, this); 
    				}
    			}
    			break;
    		case WM_LBUTTONDBLCLK:
    			ShowWindow(SW_SHOW);
    			break;
        }
        return 0;
    }
    

    Dann dieses

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setforegroundwindow.asp

    und dann dieses

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/locksetforegroundwindow.asp



  • Ich habe bereits festgestellt das das SetForegroundWindow() aus Sicherhheitsgründen unter 2003 weggelassen werden muss

    Wie hast du das festgestellt? In der MSDN hab ich darüber nichts gefunden.



  • 2003 schrieb:

    Ich habe bereits festgestellt das das SetForegroundWindow() aus Sicherhheitsgründen unter 2003 weggelassen werden muss

    Wie hast du das festgestellt? In der MSDN hab ich darüber nichts gefunden.

    nein das bezieht sich nicht auf aussagen der msdn sondern das programm was ich geschrieben habe. da sonst ein paar fehler auftreten die das ganze recht instabil werden lassen. nur das ist auch recht nebensächlich...

    das hauptproblem was ich habe ist: Debug Assertion, in afxwin1.inl in Zeile 1038 und die wird durch das TrackPopupMenu hervorgerufen. Nur leider kann ich die Funktion nicht einfach umgehen da ja sonst kein Menü sichtbar wird.



  • Schonmal meine Code versucht.

    GetActiveWindow()
    Was wenn das fenster nicht aktiv ist.



  • Unix-Tom schrieb:

    Schonmal meine Code versucht.

    GetActiveWindow()
    Was wenn das fenster nicht aktiv ist.

    ja hab ich auch mit den Funtionen von AfxGetMainWnd(), das geht alles wunderschön aber eben nur unter NT alles ab 2000 bringt mir dann die Debug Assertion.

    So langsam bin ich am verzweifeln.



  • _AFXWIN_INLINE UINT CMenu::GetMenuItemID(int nPos) const
    { ASSERT(::IsMenu(m_hMenu)); return ::GetMenuItemID(m_hMenu, nPos); }
    

    Das ganze verursacht den Fehler und wenn ich das Richtig verstehe, beschwert er sich weil mein Popupmenu kein Menü ist? Oder seh ich das falsch?



  • Ich weiß nicht. Willst du nicht oder was ist los. Wenn du meine Code versucht hättest dann würdes du merken das er zumindest ab W2K läuft. (Oder muss ich erst nachsehen welches BS ich habe)

    AfxGetMainWnd() verwende ich bei mir überhaupt nicht.
    Wenn du ein Menü haben willst das bei klick auf ein Trayicon öffnet solltest du auch ein Menü erstellen.



  • Unix-Tom schrieb:

    Ich weiß nicht. Willst du nicht oder was ist los. Wenn du meine Code versucht hättest dann würdes du merken das er zumindest ab W2K läuft. (Oder muss ich erst nachsehen welches BS ich habe)

    AfxGetMainWnd() verwende ich bei mir überhaupt nicht.
    Wenn du ein Menü haben willst das bei klick auf ein Trayicon öffnet solltest du auch ein Menü erstellen.

    also normale popups funktionieren das hab ich auch nie bezweifelt nur in meinem fall geht es nun mal nicht und das ist ja das problem, und nicht das die popups allgemein nicht gehen. mittlerweile habe ich festgestellt das das menu was angezeigt werden soll in bestimmten fällen leer ist und deswegen der fehler verursacht wird jedoch ist das genauso unergründlich da:

    das funktioniert:

    HMENU hMenu3 = CreateMenu();
    	InsertMenu (hMenu3,-1, MF_BYPOSITION | MF_STRING, IDM_ALL_START, "starten");
    	InsertMenu (hMenu3,-1, MF_BYPOSITION | MF_STRING, IDM_ALL_EXIT, "beenden");
    	this->hMenu.InsertMenu ( -1, MF_BYPOSITION , (UINT)hMenu3, "Alles Tasks");	
    	DestroyMenu(hMenu3);
    

    das wiederum nicht:

    HMENU hMenu3 = CreateMenu();
    	InsertMenu (hMenu3,-1, MF_BYPOSITION | MF_STRING, IDM_ALL_START, "starten");
    	InsertMenu (hMenu3,-1, MF_BYPOSITION | MF_STRING, IDM_ALL_EXIT, "beenden");
    	this->hMenu.InsertMenu ( -1, MF_BYPOSITION | MF_POPUP, (UINT)hMenu3, "Alles Tasks");	
    	DestroyMenu(hMenu3);
    

    und ich bezweifle stark das der fehler nur entsteht weil ich ein popupmenu hinzufüge.


Anmelden zum Antworten