Einzelnen Beitrag anzeigen

maheca

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

Thread kann Tastatur-Status nicht korrekt ändern

  Alt 12. Feb 2010, 20: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