DialogBox die topmost ist, aber trotzdem nie focusable ist.



  • Hallo, ich bin gerade dabe eine eigene Bildschirmtastatur zu erstellen.
    Geplant ist diese Tastatur auf einer Dialogbox abzubilden. Um die Tastatur immer sichtbar zu machen, setze ich topmost beim Dialog auf true.
    Damit man aber zum Beispiel den Fokus im Texteditor nicht verliert, wenn man eine Taste auf der Bildschirmtastatur drückt, darf diese Dialogbox nie den Fokus haben. Leider habe ich keine Ahnung wie das gehen würde, und ob das überhaupt geht.
    Bin für jede Hilfe dankbar.

    mfg
    Pezibär



  • Also ich habs noch nicht probiert, aber laut MSDN

    WM_SETFOCUS

    The WM_SETFOCUS message is sent to a window after it has gained the keyboard focus.

    WM_SETFOCUS
    hwndLoseFocus = (HWND) wParam; // handle to window losing focus

    Parameters
    hwndLoseFocus
    Value of wParam. Handle to the window that has lost the keyboard focus (may be NULL).
    Return Values
    An application should return zero if it processes this message.

    Remarks
    To display a caret, an application should call the appropriate caret functions when it receives the WM_SETFOCUS message.

    Man sollte meinen, wenn dein Fenster den Focus erhält, kannst den Handle des Fensters das den Focus verliert speichern, den Tastendruck deiner virtuellen Tastatur auswerten und dem Fenster dessen Handle du gespeichert hast den Focus zurückgeben. Aber wie gesagt das ist nur eine Vermutung.



  • Hallo, danke für die Antwort, ich habs probiert, es funktioniert leider aber nicht. Fokusänderungen bekommt man zwar mit, aber das SetFokus funktioniert leider nicht. Hier kurz der Code den ich verwende:

    case WM_SETFOCUS:
    		{
    			HWND hwndLoseFocus = (HWND) wParam;
    			SetFocus(hwndLoseFocus);
    			//Geht auch nicht:
    			//SendMessage(hwndLoseFocus, WM_NEXTDLGCTL, (WPARAM)hWnd, TRUE);
    
    			return (INT_PTR)TRUE;
    
    		}
    

    Trotzdem danke für die Hilfe :>



  • Mach doch mal die WIndows -Touch Tastatur auf und schaue nach, welche Styles dort gesetzt sind...


  • Mod

    Ein Dialog ist da eine schlechte Wahl, und Buttons auch.
    Die Bildschirmtastatur behandelt IMHO den Mausklick ohne, dass der Fokus umgesetzt wird. Ein Button macht automatisch bei einem Click in das Feld ein SetFocus(self); Dito der Dialog.

    Ach Ja: BTW: "Der Focus" geht nich tverloren. Der Focus eines Conmtrols ist immer je Thread gespeichert und kann "Crossthread" nicht manipuliert werden (siehe AttachThreadInput o.Ä.)

    Wenn etwas verloren geht ist es wohl eher das aktive Fenster... 😉



  • Danke für die Antworten. Die Styles der eingebauten Bildschirmtastatur will ich nicht verwenden, da ich die Tastaturbuttons dieser Bildschirmtastatur mit der User Interface Automation nicht erreiche. Deshalb mache ich mir eine eigene Bildschirmtastatur deren Controls ich dann mit der UI-Automation einsehen kann.

    Nach einigen Versuchen habe ich herausgefunden, daß wenn ich für das Dialogfenster der Tastatur WS_EX_TOPMOST | WS_EX_NOACTIVATE verwende, ich eigentlich genau das erreiche was ich will. Lediglich das Bewegen der Bildschirmtastatur auf dem Screen funktioniert noch etwas holprig, da der Redraw des Dialogs erst nach dem Abschluss der Verschiebeaktion gemacht wird, und nicht schon während des Verschiebens.


Anmelden zum Antworten