Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Capslock mit SetKeyState und Status prüfen (https://www.delphipraxis.net/182755-capslock-mit-setkeystate-und-status-pruefen.html)

Codix32 15. Nov 2014 21:16

Capslock mit SetKeyState und Status prüfen
 
Wenn ich mit SetKeyState die Taste Capslock simuliere kann ich mit folgender Funktion nicht prüfen, ob Capslock an oder aus ist, warum?

Delphi-Quellcode:
procedure TForm1.SetKeyState(const ACode: Integer; Value: Boolean);
var
 KeyState: TKeyboardState;
begin
// ZeroMemory(Pointer(@KeyState), SizeOf(KeyState));
 GetKeyboardState(KeyState);
 if (Byte(Ord(Value)) <> KeyState[ACode]) then
 begin
 Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY, 0);
 Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
 KeyState[ACode] := Ord(Value);
 SetKeyboardState(KeyState);
 end;
end;
...
...

function TForm1.Capslock_anoderaus:boolean;
var
  KeyboardState: TKeyboardState;
begin
  GetKeyboardState(KeyboardState);
  if KeyboardState[VK_CAPITAL] = 1 then Result:=True
  else
    Result:=False;
end;
...
...
procedure TForm1.Button2Click(Sender: TObject);
begin
if Capslock_anoderaus = true then Label1.caption:='LED des Capslock an der Tastatur an'
 else
 Label1.caption:='LED des Capslock an der Tastatur aus';
end;
Capslock_anoderaus funktioniert, wenn ich die Taste wirklich drücke, wenn ich sie mit SetKeystate an oder aus mache, funktioniert die Capslock_anoderaus nicht.

Luckie 15. Nov 2014 21:24

AW: Capslock mit SetKeyState und Status prüfen
 
Ich rate mal, weil ich mich damit nicht auskenne:
Delphi-Quellcode:
Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY, 0);
 Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Du lässt sie los, aber du drückst sie irgednwie nicht, oder sehe ich das falsch?

Codix32 15. Nov 2014 21:48

AW: Capslock mit SetKeyState und Status prüfen
 
Zitat:

Zitat von Luckie (Beitrag 1279916)
Ich rate mal, weil ich mich damit nicht auskenne:
Delphi-Quellcode:
Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY, 0);
 Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Du lässt sie los, aber du drückst sie irgednwie nicht, oder sehe ich das falsch?

Ich denke mit dem 'Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY, 0);' drückt man die Taste
und mit KEYEVENTF_KEYUP läßt man die Taste los.

Delphi-Quellcode:
procedure TForm1.TurnCapsLock;
begin
 SetKeyState(VK_CAPITAL, True);
end;
...
...

procedure TForm1.Button1Click(Sender: TObject);
begin
TurnCapsLock;
end;
Also drücke ich den Button, geht die Capslock LED an, drücke ich den Button ein zweites Mal, geht die LED wieder aus und das verstehe ich auch nicht:
Delphi-Quellcode:
procedure TForm1.SetKeyState(const ACode: Integer; Value: Boolean);
var
  KeyState: TKeyboardState;
begin
// ZeroMemory(Pointer(@KeyState), SizeOf(KeyState));
  GetKeyboardState(KeyState);
  if (Byte(Ord(Value)) <> KeyState[ACode]) then
  begin
  Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY, 0);
  Keybd_event(ACode, $3A, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  KeyState[ACode] := Ord(Value);
  SetKeyboardState(KeyState);
  end;
end;
Wenn doch (Byte(Ord(Value)) = KeyState[aCode] ist, passiert in dieser Proc nichts mehr.
Wie kann dann die Capslock LED dennoch ausgehen beim zweiten Klick?

Luckie 15. Nov 2014 21:55

AW: Capslock mit SetKeyState und Status prüfen
 
Ich bin davon ausgegangen, dass es zu KEYEVENTF_KEYUP auch ein KEYEVENTF_KEYDOWN gibt zum Drücken.

Luckie 15. Nov 2014 21:58

AW: Capslock mit SetKeyState und Status prüfen
 
Siehe hier: http://stackoverflow.com/questions/5...ard-operations

Codix32 15. Nov 2014 22:20

AW: Capslock mit SetKeyState und Status prüfen
 
Zitat:

Zitat von Luckie (Beitrag 1279920)

keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYDOWN, 0);//press ctrl

Geht nicht.
Aber: Keybd_event(ACode, $bA, 0, 0); geht und führt zum gleichen Ergebnis.

hathor 15. Nov 2014 22:43

AW: Capslock mit SetKeyState und Status prüfen
 
Guckt hier:
http://delphi.about.com/library/week...apsnumlock.zip


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz