![]() |
Delphi-Version: 7
j-Taste abfangen?
Hallo Jungs,
ich fange die j Taste wie folgt ab:
Delphi-Quellcode:
Nun kann es aber sein, dass der User eine andere Belegung der Tastatur eingeschaltet hat, wie fange ich dann diese Taste ab? Läuft das nicht irgendwie über die ASCII-Tabelle?
if Key = 'j' then // mach was
Danke! |
AW: j-Taste abfangen?
Ein j bleibt ein j, und das hat einen festgelegten Wert im Zeichensatz.
|
AW: j-Taste abfangen?
Welcher ist das, wo kann man das nachschauen? Aber wenn die Belegung auf ne andere Sprache umgestellt wird, funktioniert das nicht mehr. Was mache ich dann?
|
AW: j-Taste abfangen?
Due bekommst nicht die physikalische Taste übergeben, sondern der Buchstabe, der laut Ländereinstellung der Taste zugewiesen ist. Wenn durch eine andere Ländereinstellung, das "j" nicht mehr bei "j" ist, dann bekommst du den Buchstaben, der nun auf der "j"-Taste gemappt ist.
|
AW: j-Taste abfangen?
Wenn Du das Tastaturlayout umstellst, stimmt zwar die Beschriftung der Tastatur ggf. nicht mehr mit den gesendeten Zeichen überein, diese bleiben aber nach wie vor dieselben. D.h. stellst Du z.B. auf Englisch (USA) um und drückst die y-Taste auf einer deutschen Tastatur, wird ein z gesendet und andersherum.
|
AW: j-Taste abfangen?
Ja das ist mit klar, aber wie reagiere ich auf die j-Taste in allen Sprachen? Ich meine mir ist egal welches Zeichen da gesendet wird, ich brauche die Taste... sobald die j-Taste gedrückt wird, die Sprache ist egal, reagiert mein Prog darauf.
|
AW: j-Taste abfangen?
Vieleicht hilft folgender Thread. (Letzter Beitrag)
![]() |
AW: j-Taste abfangen?
Zitat:
![]() ![]() Edit: Sehe gerade du benutzt Delphi 7, in diesem Fall ists ein ASCII-String :) Aber wie gesagt, ein "J" bleibt eigentlich ein "J". z.B. Auf der englischen Tastatur ist das "Y" wo bei uns das "Z" ist und umgekehrt. Wenn jetz jemand mit einem englischen Tastatur layout bei sich auf das "Z" klickt, was bei dir jedoch das "Y" ist, wird trotzdem ein "Z" gesendet, da eben genau dafür die Tabelle und die Tastaturlayouts da sind. Also wenn du ein "J" abfragen willst, egal welche Sprache er eingestellt hat, frag einfach das ganz normale "J" ab? Wo soll da das Problem sein? :D Freundliche Grüsse |
AW: j-Taste abfangen?
Zitat:
|
AW: j-Taste abfangen?
Ok... funktioniert bei mir aber nicht, sobald ich die Sprache umstelle gleicht die if-Abfrage dem False Wert. Schalte ich zurück auf Deutsch = klappt es wieder.
|
AW: j-Taste abfangen?
Zitat:
Delphi-Quellcode:
ShowMessage(Key);
|
AW: j-Taste abfangen?
Du machst das schon im KeyPress-Event oder?
Habs gerade getestet, bei mir funktioniert dies mit Deutsch (Schweiz), Deutsch (Deutschland), Französisch (Schweiz) und Englisch (USA)
Delphi-Quellcode:
Ist dein Formular im Fokus wenn du die Taste "J" drückst? Sollte eigentlich funktionieren.
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key = 'j' then showmessage('test'); end; Ob man die Tastenposition an der Tastatur abfragen kann, weiss ich nicht, könnte aber schwer werden mit Delphi. Freundliche Grüsse |
AW: j-Taste abfangen?
Was willst du eigentlich damit erreichen? Vielleicht gibt's ja einen anderen/besseren Weg, das zu lösen.
MfG Dalai |
AW: j-Taste abfangen?
Zitat:
Ein Fragezeichen kommt bei mir raus... Muss allerdings sagen, dass das unter Lazarus mache... das konnte ich aber beim Erstellen des Threads nicht auswählen. |
AW: j-Taste abfangen?
Zitat:
|
AW: j-Taste abfangen?
Ich weiß jetzt auch nicht wirklich, was sich am "j" in den Tastaturlayouts verändern sollte. Ein J ist auch in USA, England, Schweiz, Frankreich immer noch ein J.
Beim Z oder Y würd ich's ja noch verstehen. Vielleicht könnte ein bisschen Code vom TE das Mysterium aufklären. |
AW: j-Taste abfangen?
Zitat:
Ich vermute mal es geht um den ersten Buchstabe für eine positive Bestätigung, die in deutsch Ja, in englisch Yes, in französisch Oui, in russisch Da, in ... ist. Somit hätten wir also J, Y, O, D, ... je nach Landessprache ... |
AW: j-Taste abfangen?
Ich wechsle auf eine kyrillische Sprache und da ist ein 'j' was anderes. Hier mein Code:
Delphi-Quellcode:
Ich möchte damit nur zwei Prozeduren aufrufen (Lautstärke ein/ausschalten), mehr nichts. Und ich habe mich für die j-Taste entschieden, da sie ne Markierung für blinde hat.
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: char);
begin if Key = 'j' then begin if VolumeOnImage.Visible = True then VolumeOnImageClick(Self) else VolumeOffImageClick(Self); end; end; |
AW: j-Taste abfangen?
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: j-Taste abfangen?
Zitat:
Wenn du mit deinem Kyrillischen Tastaturlayout auf das J drückst, kommt beim Programm logischerweise kein J an, somit hat das abfragen auf J auch keinen Sinn mehr. Prüfe im Debugger welches Zeichen kommt, und prüfe in der IF-Abfrage auf dieses Zeichen. |
AW: j-Taste abfangen?
Dann lass Dir doch einfach ausgeben, was im kyrillischen Tastaturlayout bei 'j' herauskommt.
|
AW: j-Taste abfangen?
Zitat:
Das heisst, dass er im KeyPress-Event ermitteln muss, welche Sprache/Tastaturlayout eingestellt ist und welches Zeichen diese Taste sendet. |
AW: j-Taste abfangen?
Zitat:
|
AW: j-Taste abfangen?
Ich denke wenn du alle Tastaturlayouts unterstützen willst, wäre es am besten wenn du das Layout beim anzeigen und beim ausblenden der Form anpasst und du trotzdem nur mit einem Layout arbeiten kannst.
Also... Bei FormShow wird das Tastaturlayout auf deutsch gesetzt. Somit kannst du ein einfaches "j" abfragen und jeder wird bei der Taste mit dem Strich, wo bei uns das normale "j" ist, ein "j" schicken. Dieser Code setzte das Layout auf das Deutsche Layout.
Delphi-Quellcode:
Quelle:
var kbCOde : LongWord;
kbString : Array[0..9] of char; begin // The following line is the translation of the MAKELANGID // macro explained in the WIN32 developper's reference help. // if you start with "LoadKeyBoardLayout" then click the hyperlink // to MAKELANGID. You will see all the constant I've used here. // No more "magic numbers" like 409 or 419. kbCode := (SUBLANG_DEFAULT shl 10) or LANG_GERMAN; // The line below is to switch to a french canadian keyboard //kbCode := (SUBLANG_FRENCH_CANADIAN shl 10) or LANG_FRENCH; //Convert the binary code to an Hex string; StrPCopy(kbString, IntToHex(kbCode, 8)); // Switch the keyboard know LoadKeyboardLayout(@kbString, KLF_ACTIVATE); end; ![]() Wenn das ausgeführt wurde, kannst du ein einfaches J abfragen. Das bei dem Kyrillischem Layout ein ? gesendet wird liegt wohl am ascii string. |
AW: j-Taste abfangen?
@milos
Ok... aber damit zwinge ich den User dazu, noch nen blinden, eine andere Belegung in meinem Prog zu nutzen... so wie ich das verstehe, oder? |
AW: j-Taste abfangen?
Ein 'j' im KeyPress bleibt immer ein 'j', egal was für ein Tastaturlayout aktiv ist, oder ob ein Input-Method-Editor (IME) dazwischen klemmt.
Bei OnKeyDown/OnKeyUp ist das was Anderes. Die Taste 'j' löst natürlich immernoch den TastenCode 'J' aus, aber ob das am Ende wirklich ein 'j' wird, ist was Anderes. > ScanCode > KeyCode > Char |
AW: j-Taste abfangen?
Zitat:
Was ich nicht ganz verstanden habe. Willst du das Programm im Hintergrund laufen lassen? Wenn ja wäre mein Vorschlag keine Option dafür. Wenn aber das Programm geöffnet werden muss könnte man es versuchen, denn du könntest das Layout wieder zurück setzen wenn das Forumlar den Fokus verliert. |
AW: j-Taste abfangen?
Zitat:
Stimmt vllt mit meiner if-Abfrage irgendwas nicht, da ein 'j' ist bei mir nicht immer ein 'j'. |
AW: j-Taste abfangen?
Zitat:
Ich habe dir schon gesagt was sehr wahrscheinlich der Grund ist wieso du ein '?' bekommst. Die Antwort lautet "ASCII-String" der nur 128 verschiedene Zeichen beinhalten kann. (Und standardmässig wir bestimmt kein kyrillisch unterstützt) Ich weiss leider nicht wie du das Problem lösen kannst, ansätze wären jedoch herauszufinden ob du das ganze mit Unicode machen kannst oder die ASCII strings auch auf Kyrillisch umstellen kannst. Weitere ansätze wüsste ich nicht mehr. Viel erfolg! Freundliche Grüsse |
AW: j-Taste abfangen?
Die j-Taste hat den Scancode 74:
Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if key=74 then Winapi.Windows.Beep(2000,50); end; |
AW: j-Taste abfangen?
Zitat:
|
AW: j-Taste abfangen?
Zitat:
|
AW: j-Taste abfangen?
Ich hab's ... das macht es. :thumb:
Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if key=74 then //... end; Vielen vielen dank an alle! Auch wenn ich nicht alles anwenden konnte, so habe ich mit eurer Hilfe viel gelernt. :thumb: |
AW: j-Taste abfangen?
Zitat:
![]() Zitat: Um aber beim für den Vertrieb in vielen Ländern geplanten IBM PC nicht in jeder länderspezifischen Tastaturvariante andere Codes generieren zu müssen, wurde jeder Taste eine Nummer zugeordnet, der sog. Scancode. Dem Scancode wurde dann erst im Rechner vom Tastaturtreiber ein ASCII-Code zugeordnet. Für den Scancode wurden die Tasten einfach nach ihrer Lage auf der Tastatur reihenweise von links nach rechts durchnummeriert, im Gegensatz zum ASCII-Code, der der alphabetischen Anordnung folgt. ----------------------- Kleine Änderung:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Self.KeyPreview:= true; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin caption := IntToStr(Key); // so bekommt man den Scancode if key=74 then Winapi.Windows.Beep(2000,50); end; |
AW: j-Taste abfangen?
|
AW: j-Taste abfangen?
Ich frag nur vorsichtshalber: Scancode = (Virtual)KeyCode?
Ich meine ja, aber dann passt das nicht mit der Aussage, das die Tasten einfach durchnummeriert wurden. Wenn 'J' die 74. Taste ist (was stimmen mag) und gleichzeitig (rein zufällig) Ord('J')=74 ist (was stimmt), dann müsste ja das 'A' (ord('A')=65) 9 Tasten links vom 'J' sein, was jetzt wiederum nicht ganz richtig ist. |
AW: j-Taste abfangen?
Nein.
ScanCode ist der Code der Taste, (Z = Z und Y = Y) KeyCode der Code nach übersetzung des KeyboardLayouts (z.B. Z und Y, je Sprache) und Char, SysChar usw. ist es ganz am Ende, z.B. nach einem eventuellen IME. |
AW: j-Taste abfangen?
Du willst keinen bestimmten Buchstaben abfangen, sondern die dritte Taste von Links in der zweiten Reihe. Oder wie?
|
AW: j-Taste abfangen?
Zitat:
Zitat:
|
AW: j-Taste abfangen?
Aus
![]() Und jetzt geh mal in deine Windows.pas, such nach den VK_-Codes und sieh dir den Kommentar bei Code 65 bis 90 an. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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 by Thomas Breitkreuz