Entwickler-Ecke

WinForms - SendKeys für alle KeyDown-KeyCodes


AXMD - Di 27.01.09 09:44
Titel: SendKeys für alle KeyDown-KeyCodes
Hallo!

Ich bastle momentan an einer vereinfachten Autovervollständigung im Intellisense-Stil für eines meiner Programme. Dazu verwende ich eine ListBox. Drückt der User nun eine Taste, während diese ListBox den Fokus hat, möchte ich, dass dieser KeyCode an das Edit-Control weitergegeben wird. Das soll allerdings nicht nur für die Buchstabentasten funktionieren, sondern für alle Keycodes außer KeyUp, KeyDown, PageUp, PageDown, Home und End, da letztere separat behandelt werden.
Nun bin ich auf die SendKeys-Klasse [http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx] gestoßen, die ziemlich genau das macht, was ich suche, allerdings muss ich die Zustände der Ctrl-, Alt- und Shift-Taste selbst berücksichtigen und auch das Escaping beachten. Daher die Frage: gibt es eine ähnliche Klasse oder eine andere Methode, die die übergebenen KeyCodes direkt weitersenden kann ohne sie umständlich selbst für SendKeys anzupassen?

AXMD


Th69 - Di 27.01.09 11:02

Du könntest direkt die WinAPI-Funktion 'SendMessage' mit WM_KEYDOWN per PInvoke benutzen: http://www.pinvoke.net/default.aspx/user32/SendMessage.html.
Zu den weiteren Parametern zu WM_KEYDOWN siehe http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx
Der 'wParam' entspricht dann dem KeyCode und als 'lParam' reicht es eine 0 anzugeben (in den meisten Fällen).


AXMD - Di 27.01.09 12:10

Hallo!

Danke für die schnelle Antwort. PInvoke möchte ich vermeiden, da das Programm portierbar bleiben soll.

AXMD


Th69 - Di 27.01.09 15:02

Nur mit reinem .NET-Mittels wirst du wohl um die SendKeys-Klasse nicht herumkommen, d.h. eine Methode selber schreiben, welche den KeyCode dann in einen String umsetzt (also "von hinten durch die Brust ins Auge" oder so ähnlich).
Jedoch gilt die Anwendung von SendKeys bei einigen Antivirenprogrammen o.ä. als Key-Injection...
(ich verwende SendKeys zum Absetzen von Ctrl-C/X/V bei Aktivierung der entsprechenden Menüpunkte "Kopieren", "Aussschneiden" und "Einfügen und kenne daher dessen Nachteile)


Kha - Di 27.01.09 15:40

Mit der Win-API habe ich mich noch nie vertragen, aber sollte das nicht doch irgendwie auf Message-Basis (DefWndProc, ReflectMessage(?)) funktionieren? Implementiert sind die Methoden jedenfalls in Mono.


AXMD - Di 27.01.09 17:50

@Kha: Ich werd mal nachsehen, ob es entsprechende Methoden auch von Microsoft gibt. Danke für den Hinweis.

AXMD


Kha - Di 27.01.09 17:56

Die gibts da schon, sonst hätte ich sie nicht genannt/gekannt :zwinker: . So viel Zeit haben die Mono-Leute nun auch wieder nicht, dass sie mehr Windows-Features als MS selbst implementieren :mrgreen: .


/add: Sieht so aus, als ob das wirklich funktionieren sollte:
http://www.mono-project.com/WinForms hat folgendes geschrieben:
Mono's Windows.Forms implementation translates the native system events such as X11 into Win32 WM_ messages and dispatches them using the WndProc mechanism. This allows applications that depend on overriding WndProc to get some features not exposed by the APIs to still run.