Prüfen ob Anwendung minimiert ist geht nicht



  • Hallo zusammen,

    ich versuche gerade rauszubekommen, ob meine Anwendung minimiert ist.
    Aber die zwei gängigen Möglichkeiten, die ich gefunden habe, funktionieren nicht.

    Der Window-Handle meiner Anwendung ist korrekt, da ein "ShowWindow(hwnd)" funktioniert.
    Was mache ich falsch?

    Folgender Quellcode:

    //ShowWindow(g_hwndMain, SW_NORMAL);// HP: - debug only - Das Haupt-Fenster auf normale Grösse und in Vordergrund bringen.
    long result = GetWindowLong(g_hwndMain, GWL_STYLE);
    bool isVisible = ((result & WS_VISIBLE) != 0);
    if (!IsWindowVisible(g_hwndMain)) {
    //if(!isVisible){
    	DoSomething();
    }
    

    Also beides, "isVisible" und "IsWindowVisible(..)" ergeben immer TRUE.
    Die "ShowWindow(..)" verwende ich, um zu prüfen, ob mein Handle OK ist. Und das ist er



  • probiers mal mit isiconic.



  • @Wade1234 sagte in Prüfen ob Anwendung minimiert ist geht nicht:

    isiconic

    Vielen Dank Wade1234.
    Das funktioniert.
    Aber was ist der Unterschied?



  • du kannst fenster als "unsichtbar" erstellen, d.h. diese werden dann gar nicht angezeigt; trojaner und sonstige hintergrundprogramme sind ein schönes beispiel. und diesen status hast du dann eben abgefragt. mit isiconic fragst du ab, ob das fenster minimiert ist. https://docs.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-isiconic?redirectedfrom=MSDN bzw. https://docs.microsoft.com/de-de/windows/win32/winmsg/windows



  • @Wade1234
    Nochmals danke!
    Das wurde aus den anderen Artikeln und den MS-Docs leider nicht klar.
    Oder zumindest nicht so eindeutig.


  • Mod

    IsIconic prüft auch nur den Fensterstil... Der eigentliche Stil den Du auch prüfen kannst ist WS_MINIMIZE. Und WS_VISIBLE ist eben nicht WS_MINIMIZE.
    https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles



  • void CPatControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {

    switch(nID)
    {
    	case SC_MINIMIZE: 
    					  ShowWindow(SW_HIDE | SW_MINIMIZE | SW_SHOWMINIMIZED);
    		              m_gdiobj.SetTaskIcon(this,m_hIcon,1,m_Log.GetFile().GetBuffer());
    					  return;
    					  break;
    	case SC_RESTORE:   
    		              if(IsIconic())
    					  {
    						ShowWindow(SW_SHOW|SW_MAXIMIZE|SW_SHOWMAXIMIZED);			
    						UpdateWindow();
    						m_gdiobj.SetTaskIcon(this,m_hIcon,0,m_Log.GetFile().GetBuffer());
    					    return;
    					  }
                         
    					  break;
    }
    
    CWnd::OnSysCommand(nID, lParam);
    

    }

    void CGdiObj::SetTaskIcon(CWnd *pWnd,HICON hIcon,short stat,char *pTitle /*=0*/)
    {
    	if(pWnd)
    	{
    		if(stat)
    		{   	
    			memset(&m_iconize,0,sizeof(m_iconize));
    			m_iconize.cbSize = sizeof(m_iconize);
    			m_iconize.hIcon  = (HICON)hIcon;
    			m_iconize.uID    = WM_USER  + (GetTickCount()%100);//more then one with same id dont work with tooltip
    			m_iconize.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
    			m_iconize.hWnd   = pWnd->m_hWnd;
    			m_iconize.uCallbackMessage = ICONIZED;
    			if(pTitle) strcpy(m_iconize.szTip,pTitle);
    			Shell_NotifyIcon(NIM_ADD, &m_iconize);
    			pWnd->ShowWindow(SW_HIDE);   
    		}
    		else  
    		{
    		  Shell_NotifyIcon(NIM_DELETE, &m_iconize);
    		  pWnd->ShowWindow(SW_RESTORE);
    		}
    	}
        m_trayed = stat;
    }
    
    ```cpp
    void CGdiObj::UpdateTaskIcon(char *pTitle)
    {
    	if (m_trayed && pTitle)
    	{
    		m_iconize.uFlags = NIF_TIP | NIF_MESSAGE;
    		strcpy(m_iconize.szTip, pTitle);
    		Shell_NotifyIcon(NIM_MODIFY, &m_iconize);
    	}
    }
    

Anmelden zum Antworten