Handle des fokussierten Fensters bekommen



  • Ich brauch ein handle zu dem fenster das grade fokus hat, also das was im vordergrund ist und grade die tastatureingaben empfängt. hab da funktionen wie GetFocus() oder GetForegroundWindow() oder GetGUIThreadInfo() gefunden, aber die gehen nur wenn mein programm grade im vordergrund ist. die ausgabe erfolgt über einen keyboard hook, immer wenn eine taste gedrückt wird sollte das fenster ausgegeben werden das im vordergrund ist, aber die funktionen geben immer 0 zurück, außer wenn mein eigenes programm im fokus ist und das bringt mir nicht viel.
    was soll ich machen?



  • Kannst du das noch einmal verständlicher erlären. Wieviele Programme?, Welches ist wann im Hintergrund und welches ist wann im Vordergrund? Welches Fenster soll gerade den Fokus für den Benutzer haben? Wie und wohin sollen die Tastatureingaben verteilt werden? Jedes Fenster im System hat ein eindeutiges Handle und kann unabhängig vom Fokus jederzeit Informationen - auch von im Hintergrund laufenden Programmen - entgegennehmen.



  • ich bin ziemlich sicher dass nur 1 fenster grade den fokus haben kann, und ich brauch das handle von diesem fenster, um dann den namen davon abzufragen und zu vergleichen. zum beispiel soll das programm irgendwas nur tun wenn grade ein bestimmtes programm, notepad.exe zum beispiel im vordergrund ist.



  • Die Remarks bei GetFocus() in der msdn scheinen zu erklären, wie man GetFocus() auch für fremde Anwendungen ans Laufen bekommt?



  • nein?



  • GetForegroundWindow ist schon richtig... was funktioniert da nicht? Beachte aber UIPI...
    http://msdn.microsoft.com/en-us/windows7trainingcourse_uipi_unit.aspx



  • Pseudocode:

    HWND GetCurrentFocusWindow()
    {
    	HWND focusWnd=GetFocus();
    	if (focusWnd!=null)
    	{
    		return focusWnd;
    	}
    	else
    	{
    		HWND foregroundWnd = GetForegroundWindow();
            if (foregroundWnd == null)
            {
                // Uns fehlen scheinbar Rechte ;/
    			return null;
            }
            else
            {
                int cur_thread_id = GetCurrentThreadId();
                int other_thread_id = GetWindowThreadProcessId(foregroundWnd, IntPtr.Zero);
    
                AttachThreadInput(other_thread_id, cur_thread_id, true);
    
                focusWnd = GetFocus();
                if (focusWnd != null)
                {
                    return focusWnd;
                }
    		}
    	}
    
    	return null;
    }
    


  • Warum so kompliziert? Begründung? Was ist anders zu "GetForegroundWindow"?
    Das mit dem "AttachThreadInput" braucht man nur, wenn man es *setzen* will... aber nicht zum Auslesen...



  • ach verdammt ich hab die ganze zeit einen fehler übersehen, dass die ausgabe des fensters das im fokus ist nicht in der keyboardhook proc passiert sondern in der windowproc meiner anwendung...
    dadurch scheint GetForegroundWindow() jetzt auch immer das richtige auszugeben, aber ich brauche noch den namen der anwendung aus dem HWND.


  • Mod

    Jochen Kalmbach schrieb:

    Warum so kompliziert? Begründung? Was ist anders zu "GetForegroundWindow"?
    Das mit dem "AttachThreadInput" braucht man nur, wenn man es *setzen* will... aber nicht zum Auslesen...

    Hm. Da ist schon ein gewaltiger Unterscheid.
    GetForegroundWindow liefert immer nur Top-Level Fenster. Also nie zum Beipsiel das Edit Control in einem Dialog.

    AttachThreadInput ist nötig wenn man GetFoxu für einen anderen Thread benötigt.



  • Die Methode heisst doch "Window"... und nicht "...Control"...
    Nein, man braucht das AttachThreadInput nicht um das _Window_ zu erhalten...


  • Mod

    Jochen Kalmbach schrieb:

    Die Methode heisst doch "Window"... und nicht "...Control"...
    Nein, man braucht das AttachThreadInput nicht um das _Window_ zu erhalten...

    Ich kann es aktuell nicht testen, aber ich meine wie SetForegroundWindow funktioniert es nur auf Top-Level Fenster.



  • In der MFC-Doku steht das, vermutlich bin ich dadurch auf den Trichter gekommen ^^
    http://msdn.microsoft.com/en-us/library/b52w40kc(v=vs.110).aspx

    ...ob das für das "echte" GetForegroundWindow() auch gilt k.A., aus der Doku kann man es da auf jedenfall nicht schließen 😉



  • Martin Richter schrieb:

    Ich kann es aktuell nicht testen, aber ich meine wie SetForegroundWindow funktioniert es nur auf Top-Level Fenster.

    Hallo Martin, wir reden doch hier nur von Get Methoden. Dazu ist es nicht notwendig. Bei den Set Methoden ist es notwendig...



  • Jochen Kalmbach schrieb:

    Die Methode heisst doch "Window"... und nicht "...Control"...
    Nein, man braucht das AttachThreadInput nicht um das _Window_ zu erhalten...

    Ein Control ist auch nur ein Window.
    Nur halt kein top-level Window.


  • Mod

    Jochen Kalmbach schrieb:

    Martin Richter schrieb:

    Ich kann es aktuell nicht testen, aber ich meine wie SetForegroundWindow funktioniert es nur auf Top-Level Fenster.

    Hallo Martin, wir reden doch hier nur von Get Methoden. Dazu ist es nicht notwendig. Bei den Set Methoden ist es notwendig...

    Vielleicht reden wir aneinander vorbei.
    Nach meinem Wissen liefert GetForegroundWindow das Parent des Controls, dass im anderen Thread den Focus hat. Niemals das Control das selbst den Focus hat.

    Auch SetFocus ist was ganz anderes als SetForegroundWindow...



  • Ja, dann reden wir vom gleichen... meine Aussagen hatten sich nicht auf den Focus bezogen.. sorry...


Anmelden zum Antworten