![]() |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Wird ein Fehler gemeldet? Wenn ja welcher?
|
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Zitat:
Ich habe eine Tastatur mit deutschem Layout. Windows 7 x64 SP1 Deutsch |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Zitat:
|
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
SendInputHelper hat ein Problem: Es verwendet TShiftState als Klassenmitglied. Das führt zu Problemen mit anderen Klassen, welche System.Classes.TShiftState verwenden.
Wie kann man dieses Problem lösen? |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Eine Möglichkeit wäre, dass man SendInputHelper in der uses-Klausel VOR System.Classes einfügt. Aber dann funktionieren alle SendInputHelper Methoden nicht mehr, welche einen TShiftState Parameter verwenden, z.B.:
Delphi-Quellcode:
procedure TSendInputHelper.AddShortCut(ShiftState:TShiftState; ShortChar:Char);
Ein verzwicktes Problem! Wie könnte man es lösen? |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Ein möglicher Workaround: Eine eigene Bridge- oder Worker-Unit erzeugen, in der die SendInputHelper-Aufrufe gekapselt werden, z.B.:
Delphi-Quellcode:
Zusätzlich sollte noch in SendInputHelper.pas TShiftState durch TSIHShiftState ersetzt werden.
unit SIHWorker;
interface uses SendInputHelper; procedure SendShortCut(DummyShiftState: Integer; ShortChar: Char); implementation var SIH: TSendInputHelper; procedure SendShortCut(DummyShiftState: Integer; ShortChar: Char); begin case DummyShiftState of 1: SIH.AddShortCut([ssShift], ShortChar); 2: SIH.AddShortCut([ssCtrl], ShortChar); 3: SIH.AddShortCut([ssAlt], ShortChar); end; SIH.Flush; end; { Todo: weitere SendInputHelper-Aufrufe } initialization SIH := TSendInputHelper.Create; finalization SIH.Free; end. Jetzt kann man die Methoden von SendInputHelper indirekt über SIHWorker aufrufen und braucht so SendInputHelper nicht mehr in anderen Units zu deklarieren (was zu den besagten Fehlern führen würde). |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Nachdem ich eine Lösung für das TShiftState-Problem aufgezeigt habe, habe ich jetzt endlich den Fehler gefunden, bei dem keine Akzentzeichen (z.B. éèáà usw.) ausgegeben wurden. Ich habe jetzt die Delphi XE3 IDE zum Debuggen verwendet, und die stürzt im Debug-Modus nicht ab, obwohl AQtime installiert ist! ;-)
Delphi-Quellcode:
Der Fehler liegt darin, dass Waldemar die Unicode-Zeichenbehandlung erst ab Ord(SendChar) = 255 angesetzt hat. Akzentzeichen wie é sind jedoch auf einer deutschen Tastatur mit den Umschalttasten Shift/Ctrl/Alt(/AltGr) nicht erreichbar (und nur diese sind im Rückgabewert von VkKeyScan kodiert), deshalb hat das nachfolgende VkKeyScan(SendChar) immer einen falschen ScanCode von 65535 (!) ergeben, wodurch natürlich kein Zeichen gesendet wurde. Die deutschen Umlaute sind zwar auch 8-bittig kodiert (haben also einen ASCII-Wert im Bereich 128-255), sind jedoch mit den Umschalttasten auf einer deutschen Tastatur erreichbar und liefern deshalb bei VkKeyScan einen korrekten Wert zurück. Bei Verwendung einer US-Tastatur würde VkKeyScan aber auch bei den deutschen Umlauten einen falschen Wert zurückgeben. Es ist also richtig, bei VkKeyScan vom kleinsten gemeinsamen Nenner - nämlich 7-bit ASCII - auszugehen!
if not((Ord(SendChar) > 0) and (Ord(SendChar) < 127)) then // war: 255
begin Result := GetUnicodeChar(SendChar, Press, Release); Exit; end; |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Verbesserung: SendInputHelper-Methoden, die kein TShiftState als Parameter übergeben, können von außen direkt über die Objekt-Variable SIH aufgerufen werden. Deshalb muss die Objekt-Variable SIH im Interface-Teil deklariert werden!
Delphi-Quellcode:
unit SIHWorker;
interface uses SendInputHelper; procedure SendShortCutChar(DummyShiftState: Integer; ShortChar: Char); var SIH: TSendInputHelper; implementation procedure SendShortCutChar(DummyShiftState: Integer; ShortChar: Char); begin case DummyShiftState of 1: SIH.AddShortCut([ssShift], ShortChar); 2: SIH.AddShortCut([ssCtrl], ShortChar); 3: SIH.AddShortCut([ssAlt], ShortChar); end; SIH.Flush; end; (* SendInputHelper-Methoden, die kein TShiftState als Parameter übergeben, können von außen direkt über die Objekt-Variable SIH aufgerufen werden. Deshalb muss die Objekt-Variable SIH im Interface-Teil deklariert werden! *) initialization SIH := TSendInputHelper.Create; finalization SIH.Free; end. |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Nach so viele Jahre :thumb:
Danke |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Zitat:
sicherlich ist es nach all den Jahren nicht mehr relevant, aber ich wollte hier mal erwähnen, das dieser Fehler jetzt beseitigt ist. Auch habe ich das Set TShiftState nach TSIHShiftState umbenannt, damit es keine Namenskonflikte mit anderen Bibliotheken geben kann. Das Repository befindet sich schon seit einigen Jahren auf GitHub: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz