Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Keyboard Hook in einem Dienst möglich? (https://www.delphipraxis.net/43103-keyboard-hook-einem-dienst-moeglich.html)

Supergrobie 29. Mär 2005 09:46


Keyboard Hook in einem Dienst möglich?
 
Hallo!

Ich habe mir die anderen Threads zum Thema Hook und zu den Diensten schon angesehen.
Leider fehlen mir dazu noch ein paar Dinge, da ich mich erst neu mit diesem Thema beschäftige!

Ist es möglich in einem Dienst eine Nachrichten Schleife ala WndProc zu starten???
Wenn ja wie??

Ist es möglich in einem Dienst ohne DLL eine Hook zu installieren???
(was mir ja im Prinzig schon gelungen ist, leider ruft der Hook meine KeyboardProg nicht auf)

Das ganze benötige ich um eine zusätzliche Tastatur in unserem Kassensystem zu integrieren.
Zusätzlich läuft über den Tastaturanschluß noch ein Barcodescanner. Ich möchte auch über
die Geschwindigkeit der Eingaben Bescheid wissen das diese Einfluss auf die Programmsteuerung
haben... Also eine etwas komliziertere Geschichte.

Vielen Dank für Eure Hilfe!!!

Stefan

NicoDE 29. Mär 2005 10:53

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von Supergrobie
Ist es möglich in einem Dienst eine Nachrichten Schleife ala WndProc zu starten???
Wenn ja wie?

Ja und nein.

Ja, weil Dienste auch in einem Desktop-Objekt einer WindowStation ausgeführt werden und weil jeder Thread (auch ohne Fenster) eine Message-Queue haben kann.

Nein, weil Du wahrscheinlich versuchen willst, mit dem Fenster vom interaktiven Desktop aus (womit einer der aktuellen Benutzer arbeitet) zu kommunizieren. Das wird deshalb schwierig, weil Fenster-Nachrichten auf den aktuellen Desktop beschränkt sind. Zudem sollten Dienste, welche unter dem Systemkonto ausgeführt werden (aus Sicherheitsgründen) nicht 'interaktiv' (eine Verbindung zum interaktiven Desktop) sein - und somit werden sie in einem eigenen, nicht-interaktiven Desktop ausgeführt.

Zitat:

Zitat von Supergrobie
Ist es möglich in einem Dienst ohne DLL eine Hook zu installieren?

Ja und nein.

Lokale Hooks, ja.
Globale Hooks, nein.

Zitat:

Zitat von Supergrobie
Das ganze benötige ich um eine zusätzliche Tastatur in unserem Kassensystem zu integrieren.
Zusätzlich läuft über den Tastaturanschluß noch ein Barcodescanner. Ich möchte auch über
die Geschwindigkeit der Eingaben Bescheid wissen das diese Einfluss auf die Programmsteuerung
haben...

Kommt das Paket komplett ohne Software und bietet der Hersteller keinen Support für das verwendete Betriessystem...?

Zitat:

Zitat von Supergrobie
Also eine etwas komliziertere Geschichte.

Jupp.

Mephistopheles 29. Mär 2005 11:19

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von NicoDE
Ja und nein.

Ja, weil Dienste auch in einem Desktop-Objekt einer WindowStation ausgeführt werden und weil jeder Thread (auch ohne Fenster) eine Message-Queue haben kann.

Nein, weil Du wahrscheinlich versuchen willst, mit dem Fenster vom interaktiven Desktop aus (womit einer der aktuellen Benutzer arbeitet) zu kommunizieren. Das wird deshalb schwierig, weil Fenster-Nachrichten auf den aktuellen Desktop beschränkt sind. Zudem sollten Dienste, welche unter dem Systemkonto ausgeführt werden (aus Sicherheitsgründen) nicht 'interaktiv' (eine Verbindung zum interaktiven Desktop) sein - und somit werden sie in einem eigenen, nicht-interaktiven Desktop ausgeführt.

Sollte man das nicht insofern einschränken, als ein Dienst zwar nicht das Flag "Interaktiv" tragen sollte, jedoch ein Zugang über das Anpassen des WinSta/Desktop-ACL durchaus legitim ist?! Gegebenenfalls kann man sogar über Impersonation zusätzlich Sicherheit einbauen. Dazu sollte es schon reichen, wenn die Hook-DLL von einem Thread geladen wird, welcher unter anderem Benutzerkontext läuft.

Die meisten scheuen es doch nur, weil die APIs zum Modifzieren der ACLs, SDs usw. usf. etwas friemelig sind :zwinker:

Ich vergaß die Stichworte:
- MSDN-Library durchsuchenSetThreadDesktop (mit Beispiel "Interacting with the User in a Service").
- MSDN-Library durchsuchenOpenDesktop
- MSDN-Library durchsuchenSetProcessWindowStation (mit Beispiel "Interacting with the User in a Service").
- MSDN-Library durchsuchenSetSecurityInfo
- MSDN-Library durchsuchenSetNamedSecurityInfo

NicoDE 29. Mär 2005 11:33

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von Mephistopheles
Sollte man das nicht insofern einschränken, als ein Dienst zwar nicht das Flag "Interaktiv" tragen sollte, jedoch ein Zugang über das Anpassen des WinSta/Desktop-ACL durchaus legitim ist?!

Das Anpassen der Sicherheitsbeschreibungen würde ich nicht als Alternative in Betracht ziehen (je nach zu unterstützender NT-Version 'viel Arbeit' bis 'zu aufwändig').

Zitat:

Zitat von Mephistopheles
Gegebenenfalls kann man sogar über Impersonation zusätzlich Sicherheit einbauen. Dazu sollte es schon reichen, wenn die Hook-DLL von einem Thread geladen wird, welcher unter anderem Benutzerkontext läuft.

Für eine weitere Tastatur braucht man keinen Hook (dafür sind Kernelmodus-Treiber da, oder alternativ Benutzermodus-Tools, welche SendInput und Konsorten verwenden). Wenn, dann würde ich den Hook in einem Tool implementieren, welches unter dem Benutzeraccount läuft und mit dem Service kommuniziert...

Zitat:

Zitat von Mephistopheles
Die meisten scheuen es doch nur, weil die APIs zum Modifzieren der ACLs, SDs usw. usf. etwas friemelig sind :zwinker:

Nicht ganz unbegründet (Inheritance gibt's erst seit 2k und viele High-Level-APIs verhalten sich je nach Version merkwürdig).

Supergrobie 29. Mär 2005 11:51

Re: Keyboard Hook in einem Dienst möglich?
 
Hmmm... Puuh!

Das scheint ja doch schwierig zu werden :roll:

Ich wäre ja froh wenn ich mit meinem Dienst die Tastatur hooken könnte.
Irgendwie kann ist Ihn starten und er beendet sich auch nicht selbständig.
Habe den Hook jetzt in eine DLL gepackt. Wie bei AyaKoshigaya's DLL nur das ich mir die Daten erst mal
wegschreibe. Senden kann ich sie an meinen Dienst ja nicht, magels Fensterhandle...

Aber kann es denn sein dass ich so auch nicht an das Benutzerdesktop ran komm, also
dessen Eingaben nicht bekomme?? Es wird anscheinend gar nichts aufgezeichnet.

Den Hook
Delphi-Quellcode:
WH_KEYBOARD_LL
gibts bei meiner windows.pas auch garnicht :wall:

Für die zusätzliche Tastatur gibts keine Treiber, braucht man normal auch nicht.
Ich möchte nur die die Eingaben kontrollieren, da es sich um ein Kassenprogamm
mit sehr vielen Funktionen handelt wo es für mich schon einen Unterschied macht ob die
Eingaben von einem Barcode kommen oder von Hand getippt werden was sich nur im Tempo unterscheidet.


Stevie

NicoDE 29. Mär 2005 11:59

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von Supergrobie
Aber kann es denn sein dass ich so auch nicht an das Benutzerdesktop ran komm, also
dessen Eingaben nicht bekomme?

Der Tastaturhook bezieht sich immer nur auf den Desktop, in welchem er installiert wurde (in diesem Falle der Desktop des Dienstes).

Zitat:

Zitat von Supergrobie
Den Hook WH_KEYBOARD_LL gibts bei meiner windows.pas auch garnicht

Neuere Delphi-Version verwenden, oder die Konstante selbst deklarieren.

Luckie 29. Mär 2005 12:02

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von Supergrobie
Senden kann ich sie an meinen Dienst ja nicht, magels Fensterhandle...

Es gibt noch andere Wege der Kommunikation zwischen zwei Prozessen: (Named) Pipes, MMF.

Zitat:

Aber kann es denn sein dass ich so auch nicht an das Benutzerdesktop ran komm, also
dessen Eingaben nicht bekomme?? Es wird anscheinend gar nichts aufgezeichnet.
Ein Hook, der von einer Anwendung geladen wird, die in der WinStat0 auf dem Default Desktop läuft, sollt eiegtnlöcih diese Eingaben bekommen.

Zitat:

Den Hook
Delphi-Quellcode:
WH_KEYBOARD_LL
gibts bei meiner windows.pas auch garnicht :wall:
Äh, wenn es schon daran scheitert, dann würde ich überlegen, ob du das nötige Wissen hast. In Delphi, sowie in der Systemprogrammierung.

Supergrobie 29. Mär 2005 12:10

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Den Hook
Delphi-Quellcode:
WH_KEYBOARD_LL
gibts bei meiner windows.pas auch garnicht :wall:
Zitat:

Äh, wenn es schon daran scheitert, dann würde ich überlegen, ob du das nötige Wissen hast. In Delphi, sowie in der Systemprogrammierung.

Mag sein, aber jeder fängt mal an!
Wenn man sich nicht dran gibt kann man ja nix lernen, oder?
Bei mir ist es 10 Jahre her als ich mich das letzte mal mit hooks rumgeschlagen habe, zur komunikation zwischen C++ und Visual Basic!
Ich nutze jetzt die Delphi 2005 Version und da ist die Konstante eben nicht in der windows.pas drin!

Stefan

Luckie 29. Mär 2005 12:19

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Zitat von Supergrobie
Mag sein, aber jeder fängt mal an!
Wenn man sich nicht dran gibt kann man ja nix lernen, oder?

Das ist war, aber wenn ich gerade anfange zu boxen, dann würde ich mir auch nicht einen der Klitschko Brüder als ersten Gegner aussuchen.

Supergrobie 29. Mär 2005 12:24

Re: Keyboard Hook in einem Dienst möglich?
 
Zitat:

Das ist war, aber wenn ich gerade anfange zu boxen, dann würde ich mir auch nicht einen der Klitschko Brüder als ersten Gegner aussuchen.
Nützt mir aber alles nix jetzt über Klitschko oder ähnliches nachzudenken. Damit komm ich nicht weiter!
Ich muß dafür nun eben ne Lösung finden...

Danke aber trotzdem!

Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 1 von 2  1 2      

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