Überprüfung ob ein bestimmtest Fenster ein Signal erhalten hat



  • Hallo zusammen,
    ich bin zur Zeit dabei mich in die WinApi einzuarbeiten. Bisher habe ich Aktionen wie z.B. Fenster erkennen, in den Vordergrund setzen und verschieben angewendet.

    Nun würde ich aber gerne überprüfen ob ein Fenster ein Signal erhalten hat. (Aktivierung)

    Kurzes Beispiel:
    Erhält ein Chat-Client wie z.B. ICQ eine Nachricht von einer anderen Person, dann wird zum einem ein Ton abgespielt und zum anderen Blinkt das Icon in der Taskleiste.

    Was für Möglichkeiten gibt es hierfür? Könnt Ihr mir bitte Suchbegriffe oder ein Beispiel nennen?
    Besten Dank



  • Hi CCFish,

    zum blinken kannst du diese Funktion nehmen:

    FlashWindow(HWND hWnd, BOOL bInvert);
    

    Ton abspielen ist eine ganz andere Sache.
    Du musst erst ein Handle zum Sounddevice laden, usw.

    Und dann einfach auf ein Ereignis reagieren und den Ton abspielen.

    Vielleicht hast du auch Glück und das hier hilft dir:

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680%28v=vs.85%29.aspx

    Zum guten Schluss kann ich dir diese Seite noch empfehlen:

    http://www.gidf.de/

    Gruß
    Ombre



  • Vielen Dank für deine Antwort.
    Ja ich habe gegooglet und nein du hast meine Frage nicht verstanden.
    Wie ich FlashWindow(HWND hWnd, BOOL bInvert); usw. verwende weiß ich.

    Nochmals zu meinem Problem:
    Wird ein Fenster im Hintergrund durch irgendeine Aktivität (wie z.B. eine ICQ Nachricht) angetriggert, dann will ich das feststellen. Was ich dann an der Stelle mache ist uninteressant.

    Gibt es also eine Funktion in der Art Bool windowIsActivated(HWND) ?

    Gruß



  • hmmmmmmm,

    eine Nachricht wird nicht geworfen die du abfangen könntest. Jedoch sollte es möglich sein, mit GetNextWindow(...) einen Handle, von einem geöffnetem Fenster zu erhalten. Als ersten Handle, kannst du den von deinem Programm übergeben. Mit der Funktion GetWindowText(...) erhällst du den Namen des Fensters.

    Wenn du dein Fenster z.B.: ICQ gefunden hast, hast du den Handle von diesem Fenster. Jetzt führst du die Funktion FlashWindow(hwnd, FALSE); aus.
    Diese hat als Rückgabewert den alten Status des Fensters. An diesem kannst du dann erkennen, ob das Fenster vorher geblinkt hat oder nicht.

    Das ganze packst du in eine Schleife und machst dazwischen ein Sleep(1000) damit nur noch sekündlich geprüft wird.

    Wenn das Fenster vorher geblinkt hat, machst du eben, was du tun möchtest.

    Ich würd das so machen:

    HWND hwnd, hwnd_eigenes_fenster;
    char Name[250];
    string sName = "", Name_bekannt = "ICQ";
    
    hwnd_eigenes_fenster = GetConsoleWindow();	// Geht nur wenn du es als Console machst,
                                                  // ansonsten hast du ja den HWND von deinem Fenster
    
    do
    {
    	hwnd = GetNextWindow(hwnd_eigenes_fenster, GW_HWNDNEXT);
    	GetWindowText(hwnd, Name, 250);
    	sName = Name;
    }while (Name != Name_bekannt);
    
    BOOL Ergebnis;
    
    do
    {
    	Ergebnis = FlashWindow(hwnd, FALSE);
    	Sleep(1000);
    }while(!Ergebnis);
    
    // Hier hat das Fenster geblinkt
    

    Hoffe dir damit geholfen haben zu können.
    Gruß
    Ombre

    Quellen:

    FlashWindow(...) = http://msdn.microsoft.com/en-us/library/windows/desktop/ms679346%28v=vs.85%29.aspx
    GetNextWindow(...) = http://msdn.microsoft.com/en-us/library/windows/desktop/ms633509%28v=vs.85%29.aspx
    GetWindowText(...) = http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx



  • Alles klar.

    Ich hatte es bisher auch so umgesetzt, dass ich mir zuerst alle Fenstertitel zurückgeben hab lassen, dann die relevanten rausgefildert und diese dann in einer Schleife nach und nach angesteuert und überprüft ob sich was geändert hat.

    Meine Hoffnung war nun, dass wenn eines der relevanten Fenster ein Signal erhält, dass ich dann meinen Schleifendurchlauf "interrupten" kann und direkt zu diesem einen Fenster springen kann. Aber das wäre auch nur eine Optimierung (und nice 2 have) gewesen.

    Besten Dank und viele Grüße



  • Nein, sowas gibt es nicht und macht IMHO auch keinen Sinn.
    Was interessiert es Fenster X das Fenster Y blinkt?

    Fenster können keine Broadcast-Messages versenden. Wenn an jedes geöffnete aber wie gesagt, das würde keinen Sinn ergeben. Zumindest nicht an fremde Anwendungen. Das ICQ an die einzelnen Chatfenster eine solche Nachricht schickt ist richtig, aber nicht an Fremdfenster.

    Es gibt noch eine Möglichkeit, bei der ich dir jedoch nicht helfen kann.
    Mit Spy++ die Nachrichten abfangen und auslesen. Ein Programm schreiben das einen Hook auf die zu überprüfende Anwendung erstellt und bestimmte Nachrichten abfängt.

    Dann bräuchtest du auch keine Schleife, weil es in deinem Fenster als normale Message ankommt.

    Hab ich aber nur gelesen, nie ausprobiert. Funktionen die du bräuchtest, habe ich auch keine im Kopf.

    Good luck und Gruß
    Ombre


  • Mod

    Du kannst nur selber durch Aufrufen von FlashWindow feststellen ob der Status gesetzt war oder nicht.
    Zweimal FlashWindow mit bInvert TRUE sollten also Dir ein Ergebnis liefern ohne den Zustand des Fensters zu verändern!



  • Perfekt Danke!


Log in to reply