Wie kann ich den Tastaturfokus ausschalten?
-
Ich habe ein einfaches leeres Fenster wie folgt erzeugt:
hwndGround = CreateWindowEx(WS_EX_TOOLWINDOW ,
LPCSTR("X"),
NULL,
WS_POPUP,
x,
y,
Width,
Height,
NULL,
NULL,
NULL,
NULL);
hwnd = CreateWindowEx(WS_EX_TOOLWINDOW ,
LPCSTR("X"),
NULL,
WS_POPUP | WS_VISIBLE,
0,
0,
Width,
Height,
NULL,
NULL,
NULL,
NULL);SetParent(hwnd, hwndGround);
hwndPixmap = CreateWindowEx(NULL,
LPCSTR("static"),
NULL,
WS_VISIBLE | WS_CHILD | SS_BITMAP,
0,
0,
0,
0,
hwnd,
NULL,
NULL,
NULL);Das Problem ist, daß ein Fenster mit einer zugeordneten leeren Fensteroutine eigentlich bei Ereignissen nichts machen sollte, und der Programmier die volle Kontrolle über die Ereignisse haben sollte, so wie es bei XWindows ebenfalls der Fall ist. Jedoch bei MSWindows passieren Dinge, die man nicht programmiert hat. So bekommt ein Fenster den Eingabefokus und wird auf die oberste Z-Ebene gebracht, wenn man es mit der Maustaste anklickt. Das mit der Z-Ebene habe ich gelöst, indem ich hwndGround und das Childfenster hwnd erzeuge. Beide haben die gleichen Ausmaße und liegen übereinander. So bleibt hwndGround in seiner Z-Ebene und hwnd ebenso. Das hwndPixmap habe ich noch zusätzlich, da bei älteren MS-Windows das Neuzeichnen fehlerhaft ist, wenn das Fenster über den linken Bildschirmrand hin- und hergeschoben wird.
Zum Fokusproblem sind die Funktionen SetFocus und GetFocus sind nutzlos. Ich kenne keine Möglichkeiten, wie man den Fremdanwendungen den verlorenen Fokus wieder zurückgibt, da man in der Messagequeue nur die eigenen Fenster der Anwendung erhält.
Es müßte idealerweise bei der Fenstererzeugung so etwas wie WS_NOFOCUS geben oder eine API Funktion, die den Fokus unterdrückt. Bislang habe nichts dazu gefunden!
Wie kann kann man den Fokus unterdrücken, bzw rückgängig machen, daß eine Fremdanwendung ihren verlorenen Fokus wieder zurückerhält?
-
Das hängt doch davon ab wie Du die Maus behandelst.
Focus und aktives Fenster ist was anderes. Ein Fenster kann den Focus haben aber nicht aktiv sein.
Jedes sichtbare, aktive Standardfenster wird aktiv bei einem Mausklick. Wenn Du das nicht willst solltest Du WM_MOUSEACTIVATE behandeln.
http://msdn.microsoft.com/en-us/library/ms645612(VS.85).aspx
-
Suchst du evtl. WS_EX_NOACTIVATE ?
Das hwndPixmap habe ich noch zusätzlich, da bei älteren MS-Windows das Neuzeichnen fehlerhaft ist, wenn das Fenster über den linken Bildschirmrand hin- und hergeschoben wird.
?!
-
Danke, es war das fehlende WS_EX_NOACTIVATE
Auf meinen älteren Compiler gibt es diesen Wert nicht, so daß ich den Wert 0x08000000L angeben mußte.Das Falschzeichnen auf älteren Windowsversionen war schon sehr merkwürdig, da es beim Verschieben des Fensters über den rechten Bildschirmrand richtig gezeichnet wurde, dagegen beim linken Bildschirmrand falsch! Auch erfolgte das Neuzeichnen des Fensters stets richtig, wenn ein darüberliegendes Fenster weggezogen wurde. Beim Verschieben über den linken Bildschirmrand war gelegentlich nicht immer gezeichnet worden. Obendrein funktionierten die Hintergrundverknüpfungen bei fast allen Maloperation außer den Pixel nicht richtig, so daß ich diesen Fehler bei allen Maloperationen durch Neuprogrammierung für Linien, Flächen etc. korrigieren mußte. Das lag vielleicht auch am Grafiktreiber.
-
Es gibt keine Neuzeichnen Probleme mit älteren Windows Versionen. Höchstens Probleme mit Deinem Code...
Ein "Standard-Popup" Window hat ein Standardverhalten, es gibt keine Fensterklasse, die "nichts" tut. Denn alleine der Aufruf von DefWindowProc sorgt ja schon für eine "Standardverhalten".
BTW: Besorge Dir ein aktueles SDK und abeite damit.