ShowWindow auf fremde Fenster?



  • Der Kern sieht so aus:

    struct KnownCaptions
    	{
    		TCHAR *pcClass;
    		TCHAR *pcCaption;
    		int iCmdShow;
    	} aKnownWindows[]=
    	{
    		NULL, TEXT("Notifier von Avira AntiVir PersonalEdition Classic"), WM_CLOSE,
    		NULL, TEXT("Notifier von Avira AntiVir Personal - Free Antivirus"), WM_CLOSE,
    		NULL, TEXT("Avira AntiVir Personal - Free Antivirus Updater"), SW_MINIMIZE
    	};
    	const int iNumKnownWindows= sizeof(aKnownWindows)/sizeof(aKnownWindows[0]);
    
    	HWND hFoundWindow=NULL;
    	WINDOWPLACEMENT PlaceMent;
    	for(int i=0; i<iNumKnownWindows; ++i)
    	{
    		if(hFoundWindow=FindWindow(aKnownWindows[i].pcClass,aKnownWindows[i].pcCaption))
    		{
    			GetWindowPlacement(hFoundWindow,&PlaceMent);
    			if(PlaceMent.showCmd != aKnownWindows[i].iCmdShow)
    			{
    				MessageBeep(MB_ICONASTERISK);				
    				if(aKnownWindows[i].iCmdShow == WM_CLOSE)
    				{
    					SendMessage(hFoundWindow,aKnownWindows[i].iCmdShow,0,0);
    					continue;
    				}
    				ShowWindow(hFoundWindow,aKnownWindows[i].iCmdShow);
    				//SendMessage(hFoundWindow,WM_SHOW,aKnownWindows[i].iCmdShow,0);
    			}
    		}
    	}
    

    Kurze Erklärung:
    Als erstes wird eine Liste mit bekannten Fenstern angelegt, und wie darauf reagiert werden soll, dann werden die Fenster einzeln gesucht.
    Wenn gefunden, dann wird geprüft ob es geschlossen werden soll, wenn ja, wird WM_CLOSE gesendet.
    Ansonsten wird geprüft ob das Fenster nicht schon so ist wie es sein soll (PlaceMent)
    Wenn es nicht so ist, wird das versucht mit ShowWindow wieder hinzukriegen.

    Beim Werbefenster klappts einwandfrei, aber den Updater runterlegen will's nicht.



  • Ich glaube, da musst du WM_SIZE senden (bin aber nicht sicher). Nette Idee, übrigens.


  • Mod

    WM_CLOSE ist doch ein ungültiger Wert für ShowWindow! Das ist doch Quatsch. Wenn müsstest Du WM_CLOSE senden!



  • Ich hab mal gelesen, dasss es funktionieren soll, den notifier zu sperren, wenn man von der notifier exe alle dateirechte für alle benutzerkonten löscht (geht aber glaub ich nur bei xp preof)



  • Die Idee ist interessant. Mit ShowWindow und SendMessage greift man aber nur momentan in ein fremdes Programm ein, ausser man sendet WM_DELETE zum Zerstören. Die Frage läuft wohl darauf hinaus, als 'Administrator' Prioritäten zu vergeben. Hiefür fehlen mir leider die Erfahrungen. Vielleicht kann das jemand anderes erklären.



  • Frage: Wieso ist hier nur 1 "=" ???

    if(hFoundWindow=FindWindow(aKnownWindows[i].pcClass,aKnownWindows[i].pcCaption))
    

    Dachte in if() sollte immer "==" stehen...

    Ist das vielleicht der Fehler?



  • nein das sollte schon richtig so sein...
    das Handle von FindWindow wird hFoundWindow zugewiesen und dann wird hFoundWindow durch das if geprüft



  • zeugt trotzdem von schlechetem stil.

    was spricht den gegen

    hFoundWindow=FindWindow(aKnownWindows[i].pcClass,aKnownWindows[i].pcCaption);
    if(hFoundWindow)
    {
      ...
    }
    


  • red kein blech, das zeugt nicht von schlechtem stil lol.



  • Also WM_SIZE ist es nicht. 😞
    Ich bräuchte sowas wie WM_SETSIZE...

    Ich hab auch schon SetWindowPlaceMent versucht, bringt nur per GetLastError "Ungültiges Handle!"

    PS: Also den Notifier beenden geht, nur kann ich das Updater-Fenster nicht minimieren.


  • Mod

    WM_SIZE ist nur eine Benachrichtigung. Wenn Du die Fenstergröße eines Fensters verändern willst musst Du MoveWindow oder SetWindowPos verwenden.


Anmelden zum Antworten