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.