Tastatur Stream hacken

CodeFatal

Erfahrenes Mitglied
Hallo,
ich möchte auf eine möglichst einfache aber effiziente Art eine Tastatur bauen ähnlich der bei Pocket PC's.
Idee ist ein Dialog mit folgenden Eigenschaften
- Immer im Vordergrund
- erhält niemals den Fokus
- registriert aber die "Tasten-Drücke"
- Fokus übergabe an den nächsten tieferen Dialog in Z-Order

Wie mach ich das am besten? bzw. wie kann ich sicherstellen, das meine Eingabe das entsprechende Feld erreicht? Muss ich mich da in den Tastatur Stream hacken und den entsprechenden Tastendruck simulieren?

Danke schon mal für eure Hilfe

Gruss Michael
 
Also das Senden des simulierten Tastendrucks sollte eigentlich recht einfach gehen: Wenn du auf eine Buchstabentaste klickst (OnLButtonDown(...)), sendest Du eine WM_KEYDOWN - Nachricht mit den entsprechenden Daten an das empfangende Fenster und wenn Du die Maustaste wieder losläßt (OnLButtonUp(...)), sendest Du die entsprechende WM_KEYUP - Nachricht.

Nur: woher weißt Du, welches das Fenster ist, das die Nachrichten kriegen soll, also in welchem die Eingaben landen sollen? Wenn Du mit der Maus in ein Fenster klickst, dann bekommt das den Focus. Ich wüßte nicht, wie man das verhindern könnte. Wenn Du also auf Dein Tastaturfenster klickst mußt du also irgendwie herausfinden, welches Fenster den Focus vorher hatte.
Dazu fällt mir allerdings nichts wirklich praktikables ein. Du könntest in Deinem Tastaturdialog vielleicht zyklisch das Fenster mit dem Fokus abfragen (mit static CWnd*PASCAL CWnd::GetFocus( ) ). Wenn Du dann den Focus bekommst, merkst Du Dir einfach den letzten ermittelten Zeiger. An dieses Fenster schickst Du die Nachrichten. Das finde ich allerdings nicht wirklich schön. Die zyklische Abfrage müßte schnell genug geschehen, daß ein Anwender nicht innerhalb eines Zyklus 2 Fensterwechsel machen kann.
Wenn jemand etwas besseres weiß, wie ich das vorhergehe Fokus-Fenster finden kann, würde es mich auch interessieren.
 
Moin, moin
Musste leider nen anderes Projekt kurzfristig vorziehen...
Habe jetzt aber mal folgendes gemacht. Wenn ich auf eine Element klicke, wird ja die EN_CHANGE Msg ausgelöst, damit bekomme ich dann heraus, welches Fenster gerade aktiv ist. Brauch dann also keinen Extra zyklus:-) Dann starte ich meine Tastatur und bei klick auf ne Taste schick ich folgendes
Code:
cWnd->PostMessage(WM_KEYDOWN,49,0);
Die Message kommt auch beim Dlg1 in der PreTranslateMessage an, nur ab dann versackt es. Es wird nix angezeigt.
Mein verzeiwflungs Code:
Code:
BOOL CKeyboardtestDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf.
	if (pMsg->message == WM_KEYDOWN)
    {
        // Wenn Taste, dann Nachricht verwerfen
        if (pMsg->wParam == VK_ESCAPE)//kein Beenden durch esc möglich
		{
			SendMessage(WM_CLOSE);
			return 1;
		}
		if(AktWnd)
			AktWnd->PreTranslateMessage(pMsg);
	}		

	return CDialog::PreTranslateMessage(pMsg);
}
Findet da jemand vielleicht nen Fehler bzw. was mach ich falsch?
 
Kommando zurück...:-)
Die KeyboardtestDlg::PreTranslateMessage(MSG* pMsg) brauch ich ja gar nicht, da ich ja mit cwnd direkt auf den richtigen Dlg zugreife...
Und jetzt das beste: Wenn man die cwnd Variable richtig wählt, dann klapt das auch, zumindest soweit ich das jetzt seh...

Danke für die Hilfe.

Gruss Michael
 
Hab mir doch gedacht, das da noch was kommt:
Kann jetzt alle Tasten senden und werden richtig angezeigt. Wenn ich SHIFT (real Tastatur) drücke, wird z.b. nen grosses A und ohne SHIFT nen kleines a geschrieben. Frage ist jetzt wie kann ich die Shift-Taste Emulieren? Mit VK_LSHIFT senden reicht leider nicht. Wie und wann wird die Taste abgefragt? Etwa in dem Dlg, in dem mein Fenster ist?

Gruss Michael
 
Zurück