AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Thread kann Tastatur-Status nicht korrekt ändern

Thread kann Tastatur-Status nicht korrekt ändern

Offene Frage von "maheca"
Ein Thema von maheca · begonnen am 12. Feb 2010 · letzter Beitrag vom 13. Feb 2010
 
maheca

Registriert seit: 12. Feb 2010
6 Beiträge
 
Delphi 2007 Enterprise
 
#1

Thread kann Tastatur-Status nicht korrekt ändern

  Alt 12. Feb 2010, 19:25
Hallo!

Bis jetzt konnte mir die Suchen-Funktion dieses Forums alle Fragen beantworten, die ich zu Delphi hatte, doch jetzt ist leider der Punkt gekommen, an dem ich selbst fragen muss ich hoffe, mir kann jemand weiterhelfen

Ich habe eine Funktion geschrieben, welche die Lämpchen auf der Tastatur (also Num Lock, Caps Lock und Scroll Lock) ein- und ausschaltet:

Delphi-Quellcode:
//SetLED dient dazu, die Leuchtdioden auf der Tastatur anzusteuern.
//LED erhält die LED, deren Zustand geändert werden soll (1 bis 3 v.l.n.r.)
//NewStatus erhält die Information, ob die LED leuchten soll oder nicht.
procedure SetLED(LED : KeyboardLED; NewStatus : Boolean);
var
  vi : TOSVersionInfo;
  KS : TKeyboardState;
  Key : Byte;
begin
  vi.dwOSVersionInfoSize:=SizeOf(vi);
  GetKeyboardState(KS);

  case LED of
    1: Key := VK_NUMLOCK;
    2: Key := VK_CAPITAL;
    3: Key := VK_SCROLL;
  end;

  if ((KS[Key] <> 0) xor NewStatus) then
  begin
      keybd_event(Key, $45, KEYEVENTF_EXTENDEDKEY, 0);
      keybd_event(Key, $45, KEYEVENTF_EXTENDEDKEY or
        KEYEVENTF_KEYUP, 0);
  end;
end;
Das ganze funktioniert auch super, solange ich die Funktion durch z.B. Buttons aufrufe. 2x Anschalten bleibt bei Buttons auch immernoch an (soll ja auch).
Wenn ich jetzt allerdings einen Thread nutze, der dafür sorgt, dass ein Lämpchen angeschaltet bleibt, indem er es einfach jede Sekunde erneut anschaltet, ergibt sich folgendes Problem:
Das Lämpchen bleibt nicht an, sondern es blinkt... Und zwar im Sekundentakt, also arbeitet meine Funktion nun vermutlich als Umschalter statt als Anschalter.

Meine Threadprozedur sieht wie folgt aus:
Delphi-Quellcode:
procedure TDMXSignal_Connected.Execute;
begin
  while not terminated do
  begin
    SetLED(3, True);
    Sleep(1000);
  end;
end;
Beinhaltet eigentlich keine potentielle Fehlerquelle (meiner bescheidenen Meinung nach... )
Beim Debuggen zeigt sich jedoch, dass der TKeyboardState für den Thread statisch wird, das heißt bei Aufruf von SetLED durch den Thread ist der KeyboardState für die jeweilige Taste immer 0.

WARUM

Ich bin ratlos und wäre echt dankbar, wenn mir jemand helfen könnte
Danke dafür im Voraus und schönes Wochenende!!
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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