Autor Beitrag
Leon669
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 06.08.16 21:35 
Hallo erstmal.

Ich habe eine Form geschrieben in dieser ist eine eigens Programmierte Tastatur und ein Webbrowser(Der Standard Browser aus Visual Studio).

Nun mein Problem, die Eingabe, in die einzelnen Fenster soll über die Tastatur erfolgen. Wenn ich nun im Browser das erste Eingabefenster drücke und dann denn ersten Buchstaben der Tastatur drücke verliert das Eingabefenster des Web Browser denn Focus und es ist keine Eingabe möglich. Meine Frage nun, wie kann ich dies unterbinden, so das meine Eingabe durch die Virtuelle Tastatur erfolgen kann.

Unten nochmal ein Bild meiner Form angefügt.

Danke im Vorraus
Einloggen, um Attachments anzusehen!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 06.08.16 23:10 
Du kannst in dem WebBrowser den Fokus einem einzelnen Element geben.
Auf die Schnelle habe ich das gefunden:
stackoverflow.com/qu...a-webbroswer-control

Bestimmt kannst Du auf ähnliche Weise heraus finden, welches Control gerade den Fokus hat, damit Du dir das merken kannst.
Wird nun eine EIngabe über die Tastatur getätigt, kannst Du danach den Fokus wieder auf das Control setzen, was vorher den Fokus hatte.



Es gibt auch eine CanFocus-Property für alle Controls.
Vielleicht reicht es ja, die bei der Tastatur und ihren Buttons auf false zu setzen, damit sich der Fokus nicht ändert.



Als dritte Idee, die zugegebenermaßen nicht unbedingt die feine englische Art ist:
Es gibt das Interface IMessageFilter.
Als kleine Vorwarnung: Die Arbeit damit erfordert viel Recherche und Arbeit mit der Windows-API, was einige nicht mögen und andere sich nicht trauen, womit man aber sehr viel machen kann.

Alle Aktivitäten vom Benutzer werden über WindowsMessages geregelt. Wenn der Benutzer mit der Maus klickt, dann sucht Windows nach dem Control, worauf geklickt wurde und schickt anschließend die WindowsMessage WM_LBUTTONDOWN an dieses Control. WindowsForms empfängt diese Messages und setzt sie in Events um. Es gibt Messages für alles mögliche, inklusive Maus und Tastatur-Aktivitäten.

Das Interface IMessageFilter und die darin enthaltene Methode erlaubt dir, diese Messages zu filtern, sodass sie nicht am Control an kommen.
Das interessante daran ist: Im Prinzip bekommst Du die Info, was geklickt wurde, ja trotzdem, nämlich im MessageFilter. Der Rest von WinForms wird davon aber nie etwas erfahren und kann daher auch nicht reagieren oder den Fokus ändern.
Meine Idee dahinter ist, dass Du die MouseClick-Messages abfängst und heraus filterst, wenn sie über der Tastatur bzw. einer der Tasten erfolgt sind. Den Click kannst Du dann verarbeiten, ohne dass die Tastatur auf üblichem Wege etwas davon erfährt.

Im Falle einer WindowsMessage bekommst Du dann ein Message-Objekt.
Darin findest Du das Handle zum Control und den Code der Message. Eine Liste der Messages gibts z.B. hier
Außerdem findest Du da lParam und wParam, beides IntPtr die je nach Message eine andere Bedeutung haben, welche das ist, steht in der Doku zur Message. Im Falle der Message WM_LBUTTONDOWN findest Du z.B. im wParam bekommst Du einen Code, welche anderen Keys noch gedrückt sind. Im lParam bekommst Du einen 4 Byte langen Integer-Wert, dessen ersten 2 Bytes (Low-Word) die X-Koordinate und die letzten 2 Bytes (High-Word) die X-Koordinate der Maus sind.
Die Methode muss true zurück geben um die Message zu blockieren.
Der MessageFilter muss über die Methode Application.AddMessageFilter registriert werden.


Mach das aber nur, wenn es keine andere im realistischen Zeitraum machbare Lösung gibt.
Du kannst zwar viel erreichen, allerdings greifst Du damit auch tief in das Verhalten von Windows und WinForms ein. Es kann z.B. passieren, dass manche sachen nicht mehr funktionieren, was Du vorher aber als Selbstverständlich gehalten hast.
Aber ich kann auch entwarnen: Im Windows kannst Du damit nicht kaputt machen, zumindest halte ich das für sehr unwahrscheinlich, solange Du es nicht aktiv versuchst.
Es kann aber zu merkwürdigen Verhalten führen, so habe ich mal ein Hook (grob umrissen eine Art Event-Handler im Windows) für die Maus registriert. Ist mein Programm abgeschmiert, hat die Maus für einige Sekunden nicht mehr funktioniert, bis WIndows dann bemerkt, dass von meinem Programm keine Antwort kommt. Das kann auf den Benutzer etwas verstörend wirken.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 07.08.16 03:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Leon669
Leon669 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 07.08.16 20:00 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Leon669 und Willkommen,

der Ansatz mit dem Fokus geht schonmal in die richtige Richtung:

ausblenden C#-Quelltext
1:
2:
webBrowser1.Document.Focus();
SendKeys.Send("A");

Anstelle des SendKeys, kann man auch auf die WinAPI Funktionen keybd_event oder SendMessage zurückgreifen.


Also das funktionierte bei mir sofort danke nochmal.