![]() |
Re: KeyboardLED
Wann bekomme ich denn meine D5-DCU ? :duck: :duck:
|
Re: KeyboardLED
Ach Daniel ... du machst mir Sorgen ... :)
Ich konnte bisher kein D5 an Land ziehen und wir wollten es eigentlich als ClosedSource behandeln. Ich hab grad den Marco gefragt und wir sind uns einig geworden, das du den Source unter der Bedingung bekommst, das er weiter "cliosed" bleibt. Wenn du einverstanden bist, kannt du ihn Montag haben. Dann kommen wir wieder ran. |
Re: KeyboardLED
Zitat:
Zitat:
|
Re: KeyboardLED
Danke an Daniel G....
jetzt gibts KeyboardLED auch als Delphi 5 Unit unter oben genanntem Link |
Re: KeyboardLED
Zitat:
Man sollte auch vorher den aktuellen Status der LEDs abfragen und diesen zwischenspeichern. In meiner Direkt-Port-Access Unit sieht dies so aus:
Delphi-Quellcode:
Man könnte so auch die Laufwerks LEDs leuchten lassen
procedure TPort.SetKeyboardLED(LED: Byte; State: TLEDState);
function LEDState: System.Byte; begin Result := 0; if GetCurrentThreadID <> MainThreadID then AttachThreadInput(GetCurrentThreadID, MainThreadID, True); if GetKeyState(vk_Scroll) and 1 <> 0 then Result := Result or klScroll; if GetKeyState(vk_NumLock) and 1 <> 0 then Result := Result or klNum; if GetKeyState(vk_Capital) and 1 <> 0 then Result := Result or klCaps; if GetCurrentThreadID <> MainThreadID then AttachThreadInput(GetCurrentThreadID, MainThreadID, False); end; begin if FKbdLED and $80 = 0 then FKbdLED := FKbdLED or $80 or LEDState; case State of lsReset : FKbdLED := FKbdLED and not LED or LEDState; lsOn : FKbdLED := FKbdLED or LED; lsOff : FKbdLED := FKbdLED and not LED; end; if FKBdLEDTime <> 0 then while FKbdLEDTime >= GetTickCount do ; PortB[$60] := $ED; FKbdLEDTime := HDDelay; while FKbdLEDTime > 0 do Dec(FKbdLEDTime); PortB[$60] := FKbdLED and klAll; FKbdLEDTime := GetTickCount + 1; end;
Delphi-Quellcode:
Beachten sollte man aber das man auf einem Protected Mode OS normalerweise keinen Zugriff auf die Ports hat, nur Kernelmode Treiber sollten dies können. Um nun denoch aus Ring 3 heraus Zugriff auf die Ports zu bekommen wird dieser Schutz deaktiviert und meistens alle Ports für alle Anwendungen freigegeben, zb. mit GiveIO.sys oä.
procedure TPort.SetDriveLED(Drive: Byte; State: TLEDState);
begin Drive := Drive and 3; if State = lsOn then Drive := Drive or (not Drive shl 4); PortB[$03F2] := Drive; end; Dies hat aber nun zur Folge das dies 1. nur unter WinNT/Win2k etc funktioniert und 2. das eine Anwendung die auf Grund irgendwelcher Fehler in den Port Bereich irgendwelche Daten schreibt dafür sorgt das Hardware oder Daten zerstört werden können. Ich würde sowas nicht benutzen wollen. Gruß Hagen |
Re: KeyboardLED
Hallo,
Zitat:
Zugriffe auf Ports für dort zu einer Exception. (Sorry aber ich hatte den Beitrag von negaH nicht gelesen) Rainer |
Re: KeyboardLED
Zitat:
Aber daß das mit Interrupts nix zu tun hat, ist nicht ganz korrekt... Es ist nur dumm, daß man unter XP die Interrupts nicht sperren darf (cli etc.) Zitat:
Zitat:
Zitat:
Zitat:
|
Re: KeyboardLED
Delphi-Quellcode:
Doch funktioniert unter Win95 bis WinXP. Aber nur weil dieses PortB[], PortW[], PortL[] meine Entwicklungen sind. Ich bezog mich also nicht auf das alte PASCAL Port[] sondern auf meine direkt Port Access Unit.
PortB[$03F2] := Drive;
Zitat:
Der Zugriff auf den Keyboard Port hat insofern mit Interrupts nur damit zu tun das man diese eventuell mit CLI/STI sperren sollte, mehr aber auch nicht. Zitat:
Mal ne andere Frage: Funktioniert dein Code auch unter Win95 uä. ? Gruß Hagen |
Re: KeyboardLED
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: KeyboardLED
Zitat:
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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