wie kann ich von aussen verhindern, daß ein window den focus erhält?



  • hallo zusammen,

    ich hab ein dringendes problem vc++ betreffend für das ich schon seit nun bald 2 wochen vergeblich eine antwort suche. zunächst mal eine einführung in das projekt an dem ich arbeite. lasst euch aber nicht täuschen, mein problem ist rein vc++ basierend.

    ich arbeite im moment an eine bridge zwischen java und twain. da twain mit einem gültigen HWND initiert wird, ist es mir nicht möglich twain von java direkt aus anzusprechen. deshalb habe ich eine vc++ dll geschrieben, deren methoden die twain befehle aufrufen. auf diese methoden greife ich von java mittels JNI zu. diese dll erzeugt ein verstecktes fenster und übergibt das HWND davon an twain zur initierung. nebenbei merkt es sich dieses noch in einer globalen variablen, da es später nocheinmal benötigt wird.

    wenn ich mit twain scanne, läßt twain ein fenster mit einem fortschrittsbalken und einem abbruch-button im vordergrund erscheinen. jedes mal, wenn eine neue seite in den feeder eingezogen wird, erhält dieses fenster den focus und wird in den vordergrund geschoben. ich möchte aber eine applikation entwickeln, die es dem user erlaubt, die bereits eingescannten bilder zu editieren wärend der scanner arbeitet. das wäre so also nicht möglich. glücklicherweise besitzt twain aber eine eigenschaft, mit der sich dieses fenster abschalten läßt. soweit, sogut. 🕶

    das problem ist jetz folgendes: trotzdem das fenster mit dem fortschrittsbalken abgeschalten ist, verliert meine java applikation trotzem jedesmal den focus, wenn eine neue seite in den feeder eingezogen wird. ich vermute, daß dieses fensterchen nur unsichtbar gemacht wurde, also trotzdem vorhanden ist und sich den focus holt, der dann für den user im nirvana verschwindet (sieht so aus, als hätten wohl ein paar entwickler nicht mitgedacht). 🙄

    meine fragen sind:
    1. wie kann ich herausfinden ob dieses fenster den focus erhalten hat (bzw. gerade hält)?
    2. wie kann ich verhindern, daß es den focus erhält?

    hier noch einige erläuterungen, die eure antworten hoffentlich in die richtige richtung führen:

    ich benutze keine MFC und meine dll ist nicht objekt orientiert. meine dll besteht nur aus einem haufen methoden und ein paar globalen variablen. in den methoden werden neben twain und jni nur noch Win32 methoden aufgerufen.

    das fenster mit dem fortschrittsbalken ist ein kind des HWNDs das ich zur initierung von twain benutzt habe. ich möchte aber dieses HWND nicht so gestalten, daß es und seine kinder niemals den focus erhalten könnten. es gibt nämlich noch andere fenster, die als kinder von meinem HWND erscheinen, die den focus benötigen. schön wäre eine antwort die mir hilft eine art schalter zu entwickeln, mit dem ich die eigenschaft den focus zu erhalten ein-/ausschalten kann.

    vielen dank 🙂
    wayne



  • Also erstmal zum setzen des Fokusses. Den Fokus auf ein HWND setzt du mit der API-Funktion SetFocus(HWND)... Mit GetFocus() holst du dir das Fenster welches den Fokus hat. Allerdings gibt es da das Problem, dass die Funktionen nur in der Message-Queue des aktuellen Threads funktionieren. Ich denke aber, dass das Fenster in einem anderen Thread ist. Ist nicht ohne dein Problem so wie ich das auf den ersten blick sehe......... 😕



  • Ich glaube damit bist du besser im WinApi forum aufgehoben...

    Devil



  • So könnte es funktionieren:

    Du reagierst auf die Nachricht WM_KILLFOCUS mit einem SetFocus(hWnd), wobei hWnd dein eigenes Fenster ist. WM_KILLFOCUS wird gesendet wenn dein Fenster dabei ist den Focus zu verlieren.

    Dazu muss aber gesagt werden, dass das kein sehr kooperatives Verhalten gegenüber anderen Anwendungen ist. 😉


Anmelden zum Antworten