Moin,
Um einem XY Problem vorzubeugen gleich vorweg das Ziel: Ich möchte ein GDI+ Ctrl basteln welches ähnlich zu einem Input-Ctrl arbeitet. (Texteingabe möglich). Außerdem soll es intern "keine" AutoIt-Ctrls verwenden, also kein "verstecktes" Ctrl das ausgelesen wird. Da das ganze angezeigt wird ist ein GUI vorhanden, RegisterMsg etc. funktioniert, GUIOnEventMode ist an. Die Tasten sollen nur gecaptured werden, wenn das GUI auch aktiv ist. Gedrückthalten von Tasten soll sich genauso verhalten wie man es vom InputCtrl gewohnt ist (also zunächst 1 Zeichen, dann kurze Pause, dann am laufenden Band neue Zeichen). Zu allem überfluss soll das ganze im Leerlauf möglichst wenig Performance brauchen, es wäre unschön, wenn ein Programm alleine 50% der Rechenzeit dafür aufwendet um ein InputCtrl zu verwalten.
Anätze
> IsPressed/Keyboardstate:
- Sehr viel Code muss ausgeführt werden um anständig festzustellen was gedrückt wurde.
- Kombinationen müssen von Hand ausgewertet werden (z.B. Shift + Taste)
- Wird immer ausgeführt egal ob GUI aktiv ist, oder nicht.
- Das Verhalten von "gedrückt halten einer Taste" muss manuell nachgebildet werden.
> Hotkeys:
- Unmengen Hotkeys müssen registriert werden.
+ Kombinationen wie Shift + Taste oder ähnliches ohne weitere Logik abrufbar.
- Wird immer ausgeführt egal ob GUI aktiv ist, oder nicht.
+ Das Verhalten von "gedrückt halten einer Taste" wird unterstützt.
> GUISetAccelerators:
+ Alle "Hotkeys" sind schnell und einfach initialisierbar (2D Array)
+ Kombinationen werden unterstützt.
? Belastet den GUIMessageLoop/EventLoop (wir sind im GUIOnEventMode, also werden die Accelerators -> Msgloop/Eventloop weitergeleitet) Keine ahnung "wie belastend" das ist, wenn da 150 Registrierungen drin sind.
+ Funktioniert nur wenn GUI aktiv.
- Braucht "versteckte Ctrls" (DummyCtrl).
? Das Verhalten von "gedrückt halten einer Taste" wird unterstützt?
> GUIRegisterMsg + Keymessages:
+ (glaube ich) Kombinationen werden unterstützt.
+ Belastet soweit ich weiß den Message/Eventloop nicht.
? Messages werden nur verschickt, wenn GUI aktiv?
+ (glaube ich) Man hat Zugriff auf zusätzliche Infos, weil lParam und wParam mehr als nur den Key der gedrückt wurde beinhaltet?
? Das Verhalten von "gedrückt halten einer Taste" wird unterstützt?
Jetzt kommt die Frage: Was habe ich übersehen (gibt es noch weitere Wege?), und gibt es einen "richtigen" Weg bei der Sache?
Einige Punkte habe ich mit Fragezeichen markiert, weil ich nicht genau weiß wie sich die Funktionen verhalten und weil ich nicht alles ausprobieren will.
Hier braucht niemand irgendwelchen Code zu posten, alles was ich möchte ist (falls ihr etwas in der Art schonmal gemacht habt) eine Info wie man sowas richtig angeht.
Meine Tendenz ist GUIRegisterMsg zu verwenden, aber vllt hat ja jemand hier mehr Erfahrung und kann mir einen Tipp geben.
lg
M