AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte KeyboardLED (Update: ohne DLL)
Thema durchsuchen
Ansicht
Themen-Optionen

KeyboardLED (Update: ohne DLL)

Ein Thema von MarcoWarm · begonnen am 12. Okt 2005 · letzter Beitrag vom 2. Aug 2006
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Benutzerbild von MarcoWarm
MarcoWarm
Registriert seit: 10. Sep 2003
um nicht weiter den Thread von Daniel G zuzumüllen will ich die Unit mal hier "anpreisen".

KeyboardLED ermöglicht es die LEDs des Keyboards zum leuchten zu bringen (ach... wer hätte das gedacht ) und das ganz ohne das virtuelle "Drücken" von NumLock & Co.

Den Download gibts bei TUO.

@Airblader: jetzt gibts auch gleich ne eingebaute Funktion zum zurücksetzen der LEDs
Angehängte Dateien
Dateityp: zip keybleddemo_938.zip (211,3 KB, 141x aufgerufen)
 
Daniel G
 
#31
  Alt 14. Okt 2005, 15:45
Wann bekomme ich denn meine D5-DCU ?
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#32
  Alt 14. Okt 2005, 16:53
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.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Daniel G
 
#33
  Alt 14. Okt 2005, 18:35
Zitat von chaosben:
Ach Daniel ... du machst mir Sorgen ...
Komisch... Das sagt mein Tutor auch immer.
Zitat von chaosben:
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.
=> Siehe PN
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#34
  Alt 17. Okt 2005, 14:31
Danke an Daniel G....

jetzt gibts KeyboardLED auch als Delphi 5 Unit unter oben genanntem Link
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#35
  Alt 18. Okt 2005, 03:02
Zitat:
zwei Byte-Code-Kommando an den Tastaturinterrupt sendet
Diese Aussage ist falsch. Man sendet über den Tastatur-PORT direkt die Daten an den Keyboard Controller. Mit Interrupts hat dies reingarnichts zu tuen.

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:
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;
Man könnte so auch die Laufwerks LEDs leuchten lassen

Delphi-Quellcode:
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;
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ä.
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
  Mit Zitat antworten Zitat
runger
 
#36
  Alt 18. Okt 2005, 05:21
Hallo,

Zitat:
PortB[$03F2] := Drive;
funktioniert unter Win2k und WinXP sowieso nicht.

Zugriffe auf Ports für dort zu einer Exception.


(Sorry aber ich hatte den Beitrag von negaH nicht gelesen)
Rainer
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#37
  Alt 18. Okt 2005, 06:02
Zitat von negaH:
Mit Interrupts hat dies reingarnichts zu tuen.
Ok... mein Satz war ein wenig unglücklich formuliert (ist korrigiert worden) danke.
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 von negaH:
Man sollte auch vorher den aktuellen Status der LEDs abfragen und diesen zwischenspeichern
du prüfst nicht den aktuellen LED-Status, sondern welche Tasten gedrückt wurden. Das ist ein großer Unterschied. Das sagt nämlich nur aus, welche LEDs leuchten sollten!!! (Übrigens machen wir das auch)

Zitat von negaH:
Delphi-Quellcode:
....
  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;
...
wie ich sehe, führst du keinerlei Prüfungen durch, ob der Port die Daten akzeptiert hat.... Das sollte man schon tun. Dann schließt man auch aus, daß man die Daten ausversehen an einen falschen Port schreibt. Der Keyboardcontroller gibt nämlich ein acknowledged Signal für die gesendeten Daten zurück (bitte vor dem schimpfen die Theorie büffeln)

Zitat von negaH:
as 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.
Daher der Disclaimer

Zitat von negaH:
Ich würde sowas nicht benutzen wollen.
Das musst du ja zum Glück auch nicht
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#38
  Alt 18. Okt 2005, 06:49
PortB[$03F2] := Drive; 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.


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.)
Doch man darf aber eben nur in einem Kernelmode Treiber, bzw. nur mit den entsprechenden Privilegien. Diese könnte man auch für eine Ring 3 Application einrichten.

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:
wie ich sehe, führst du keinerlei Prüfungen durch, ob der Port die Daten akzeptiert hat.... Das sollte man schon tun. Dann schließt man auch aus, daß man die Daten ausversehen an einen falschen Port schreibt.
Besser wäre es schon, aber soviel wie ich weis gibt es keinen PC der keinen 8253 kompatibeln PIO hat. Ergo kann man sich 99.9% sicher sein das $60 einer der Keyboardports ist. Aus Sicht des Timings wäre das Abfragen des Acknowledges aber schon richtiger. In meinem Code benutze ich halt eine Waitloop.

Mal ne andere Frage: Funktioniert dein Code auch unter Win95 uä. ?

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#39
  Alt 18. Okt 2005, 07:39
Zitat von negaH:
Doch man darf aber eben nur in einem Kernelmode Treiber, bzw. nur mit den entsprechenden Privilegien. Diese könnte man auch für eine Ring 3 Application einrichten.
es ging ja auch um eine Unit, die jeder einsetzen kann... und nich jeder kann und will o.g. Sache tun.

Zitat von negaH:
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.
also doch... ok ... ich werd nich mehr drauf rum reiten

Zitat von negaH:
Ergo kann man sich 99.9% sicher sein das $60 einer der Keyboardports ist.
die Erfahrung hat gezeigt, daß einige Controller sich doch ein wenig affig haben (vor allem bei einigen Notebooks, USB und älteren XT Controllern)

Zitat von negaH:
Mal ne andere Frage: Funktioniert dein Code auch unter Win95 uä. ?
zumindest unter Win98 ja... Kühne Behauptung: also auch unter Win95
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#40
  Alt 18. Okt 2005, 08:19
Zitat von MarcoWarm:
zumindest unter Win98 ja... Kühne Behauptung: also auch unter Win95
welchen Trick setzt du ein ? CallGate oder VXD Treiber ?

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 08:40 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