Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PC-Aktionen an mehrere PCs im Netzwerk senden (https://www.delphipraxis.net/102021-pc-aktionen-mehrere-pcs-im-netzwerk-senden.html)

1ceman 22. Okt 2007 11:58


PC-Aktionen an mehrere PCs im Netzwerk senden
 
Ich möchte ein Programm schreiben, was alle tastatureingaben und mausbewegungen an andere PCs im Netzwerk schickt, wo diese Eingaben und Bewegungen ausgeführt werden sollen.
Ich habe mir das so gedacht, dass ich einen Server-programm schreibe, was auf dem PC läuft, auf dem ich arbeite. Dieses Programm schickt alle Eingaben an die Clients. Das Client-programm ist auf allen anderen Rechner im Netzwerk und führt diese Eingaben aus.(sinn ist es dass ich auf alle PCs gleichzeitig was installieren kann oder dateien anders ordnen kann)
Mein Problem ist jetzt, dass ich die Maus und Tastatureingaben mit Hooks abfragen muss/sollte.
Ich hab jetzt auch schon mehrere Tutorials zu dem Thema gelesen und mich auch ein wenig in win32 API eingearbeitet (wirkklich nur wenig).
Was ich jetzt noch nicht so ganz verstehe ist, ob ich das Server Programm als VCL Programm "schreiben" kann und dann einfach die Hooks da einbinden kann, oder ob ich das Server-Programm auch als Non-VCL Programm "schreiben" muss. Das Nächste Problem was ich habe, wie binde ich die Hooks genau ein, weil bei allen Bsp-Projekten sind die Programm alle NonVCL Programme.

Ich hoffe ich hab mein Problem und mein vorhaben einigermaßen verständlich erklärt und dass ihr mir helfen könnt.

Relicted 22. Okt 2007 12:10

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
huhu!

meist werden hooks über dll's eingebunden. ist eigentlich eine ganz einfache sache.
ich mache es meist so dass die dll eine windows message ans hauptprogramm schickt wenn z.b. eine taste gedrückt wurde.

Hier im Forum suchentastatur hook

sollte eigentlich genug treffer geben :-)

gruß
reli

RavenIV 22. Okt 2007 12:28

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Sowas ähnliches bietet Windows schon von haus aus.
Leider hab ich den Namen vergessen.
Jedenfalls schreibst Du ein Script, legst es auf dem Server ab.
Beim nächsten Booten (und evtl. Einloggen) wird die Software installiert, irgendwelche Files verschoben oder sonst was gemacht.
Vorraussetzung hierfür ist jedoch eine Domäne oder zumindest ein Windows-Server.

Phoenix 22. Okt 2007 12:44

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Zitat:

Zitat von 1ceman
(sinn ist es dass ich auf alle PCs gleichzeitig was installieren kann oder dateien anders ordnen kann)

Das erledigst Du besser über Scripte.
Die Sache mit Tastatur / Mauseingaben senden ist eine unsichere Kiste. Was, wenn ein paar Rechner z.B. langsamer sind als der, an dem Du sitzt? Dann machst Du Eingaben und diese Rechner erwarten die noch nicht. Dann hast Du halbe Installationen dort offen und musst die an diesen Rechner dann einzeln zu Ende führen...

Scripte kannst Du übers Netz auf die einzelnen Rechner kopieren. Auch das geht z.B. mit Scripten, so dass Du einmal ein 'Verteilungs'-Script schreibt, dass Dir z.B. ein Script oder einen Ordner auf die Netzrechner kopiert.

Und mit einem anderen Call-Script kannst Du dieses verteilte Script (z.B. die Umsortierung der Dateien, die Silent-Installation) auch remote ausführen.

Das ist sauberer und läuft letzlich auch zuverlässiger und wahrscheinlich auch schneller als mit so einem Tool.

1ceman 23. Okt 2007 08:17

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Danke für eure antworten...
@RavenIV, Phoenix: Stimmt das sind gute Ideen. Wie ich es letztendlich mache gucke ich mal ;)

Ich würd aber trotzdem gerne versuchen das Programm hinzubekommen.(ehrgeiz :P)

Hab jetzt folgendes in meine Projekt stehen:
Delphi-Quellcode:
procedure TF_Netz_Server.FormCreate(Sender: TObject);
begin
  lib := LoadLibrary('Keyboardhook.dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    InstallHook := GetProcAddress(lib, 'InstallHook');
    UnInstallHook := GetProcAddress(lib, 'UninstallHook');
  end; // else ERROR
  InstallHook(self.Handle);
end;

procedure TF_Netz_Server.FormDestroy(Sender: TObject);
begin
freelibrary(lib);
end;

procedure TF_Netz_Server.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  uninstallhook;
end;
Nur das funktioniert irgendwie nicht so richtig...
beim Aufruf von installhook kommt imer folgende Fehlermeldung:
Zitat:

Project P_Netz_Server raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue.
ich weiß aber auch nicht so richtig wie ich das keyboardhook.dll einbinden soll und ob ich sie .dpr oder .dll nennen soll, weil sie einfach als dll zu bennen geht nicht, da Delphi dann sagt dass es keine gültige Windows-Datei ist.

Relicted 23. Okt 2007 08:22

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
es muss folgendermaßen heißen:

Delphi-Quellcode:
 @InstallHook := GetProcAddress(lib, 'InstallHook');
man beachte das @

... oder statisch angeben...

Delphi-Quellcode:
procedure InstallHook(); external 'KeyboardHook.dll';
gruß
reli

1ceman 23. Okt 2007 08:57

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Danke das funktioniert.
Jetzt hab ich nur noch ne Frage:
Delphi-Quellcode:
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
       sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
      end;
  end;
end;
ist diese zeile dafür zuständig, dass was an meine Form gesendet wird???
Delphi-Quellcode:
sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
Und wie kann ich die Message in meinem Hauptprogramm lesen/auswerten??

sry für diese vlt dummen fragen, aber bei den ganzen bsp-Programm und tuts check ich das net so ganz...
Ich hoffe ich find noch ein einfacheres, weil würde schon gerne besser verstehen was da genau passiert. Also von der Theorie her
versteh ich das(glaub ich).

mfg
1ceman

Relicted 23. Okt 2007 09:06

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
richtig... das ganze kommt bei dir im hauptprogramm an...

ins hauptprogramm packste folgende funktion:

Delphi-Quellcode:
type
  TForm1 = class( TForm )
  //...
    protected
      procedure GotKeyMessage( var msg : TMessage ); message WM_KeyLogMessage;
  //...
  end;

dann kannst du im implementation teil über msg.wParam und .lParam auf die keys zugreifen... was genau zurück kommt weiß ich gerade ad hoc nicht... wenn ichs zufällig finde schreib ich nen edit...


gruß
reli

1ceman 23. Okt 2007 10:08

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Danke für die schnelle Hilfe!

Nur es kommt nix bei der Form an. Ich glaube ich hab auch irgendwie die .dll nicht richtig drin.
Hier ist erstmal der Quellcode meiner Form:
(ich hab die deklarationen der uninteressanten Proceduren mal rausgenommen, damit es was übersichtlicher ist)
Delphi-Quellcode:
unit U_Netz_Server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ScktComp, ExtCtrls, U_ASCII, Menus, Buttons, Winsock;

const
WM_KeyLogMessage = WM_USER + 23;

type
  TF_Netz_Server = class(TForm)
    ServerSocket: TServerSocket;
    SpE_Port: TSpinEdit;
    L_Port: TLabel;
    M_History: TMemo;
    E_Senden: TEdit;
    B_Senden: TButton;
    LB_Clients: TListBox;
    Timer: TTimer;
    B_Listen: TButton;
    RB_Key: TRadioButton;
    RB_Direkt: TRadioButton;
    RB_Kombi: TRadioButton;
    RB_Nichts: TRadioButton;
    Pop_ASCII: TPopupMenu;
    PopItem_ASCII: TMenuItem;
    BitB_Win_E: TBitBtn;
    B_Doppelpunkt: TButton;
    BitB_Win: TBitBtn;
    B_Slash: TButton;
    B_Backslash: TButton;
    B_Tab: TButton;
    B_Alt_F4: TButton;
    B_Shift_Tab: TButton;
    B_Alt_Tab: TButton;
    L_IP: TLabel;
    E_IP: TEdit;
    B_Strg_X: TButton;
    B_Strg_C: TButton;
    B_Strg_V: TButton;
    procedure TimerTimer(Sender: TObject);
    procedure B_ListenClick(Sender: TObject);
    procedure B_SendenClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RB_KeyClick(Sender: TObject);
    procedure RB_KeyKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure B_ListenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure B_SendenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_SendenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure PopItem_ASCIIClick(Sender: TObject);
    procedure BitB_Win_EClick(Sender: TObject);
    procedure BitB_WinClick(Sender: TObject);
    procedure B_Alt_F4Click(Sender: TObject);
    procedure B_DoppelpunktClick(Sender: TObject);
    procedure B_SlashClick(Sender: TObject);
    procedure B_BackslashClick(Sender: TObject);
    procedure B_TabClick(Sender: TObject);
    procedure B_Shift_TabClick(Sender: TObject);
    procedure B_Alt_TabClick(Sender: TObject);
    function GetLocalIPs: String;
    procedure FormCreate(Sender: TObject);
    procedure B_Strg_XClick(Sender: TObject);
    procedure B_Strg_CClick(Sender: TObject);
    procedure B_Strg_VClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    protected
      procedure GotKeyMessage( var msg : TMessage ); message WM_KeyLogMessage;
  private
    { Private declarations }
    Connections: Integer;
    Keys_loggen: Boolean;
  public
    { Public declarations }
  end;

 
  TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
  TUninstallHook = function: Boolean; stdcall;


var
  F_Netz_Server: TF_Netz_Server;
  InstallHook: TInstallHook;
  UninstallHook: TUninstallHook;
  lib: Cardinal;

implementation

{$R *.dfm}

procedure TF_Netz_Server.GotKeyMessage( var msg : TMessage );
begin
M_History.Lines.Add(inttostr(msg.WParam));
M_History.Lines.Add(inttostr(msg.lParam));
end;

procedure TF_Netz_Server.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin                                          
  ServerSocket.Close;
end;

procedure TF_Netz_Server.FormCreate(Sender: TObject);
begin
  E_IP.Text := GetLocalIPs;
  lib := LoadLibrary('Keyboardhook.dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    InstallHook := GetProcAddress(lib, 'InstallHook');
    UnInstallHook := GetProcAddress(lib, 'UninstallHook');
  end; // else ERROR
end;

procedure TF_Netz_Server.FormDestroy(Sender: TObject);
begin
freelibrary(lib);
end;

end.

So und jetzt meine datei keyboardhook.dpr:

Delphi-Quellcode:
library Keyboardhook;

uses
  Windows,
  Messages;

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;
  WM_KeyLogMessage: WM_USER + 23;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
       sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
      end;
  end;
end;

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
        setprop(WindowHandle, 'mous_ncode', nCode);
        setprop(WindowHandle, 'mous_hwnd', PMOUSEHOOKSTRUCT(lParam)^.hwnd);
        setprop(WindowHandle, 'mous_hitt', PMOUSEHOOKSTRUCT(lParam)^.wHitTestCode);
        setprop(WindowHandle, 'mous_xpos', PMOUSEHOOKSTRUCT(lParam)^.pt.x);
        setprop(WindowHandle, 'mous_ypos', PMOUSEHOOKSTRUCT(lParam)^.pt.y);
        SendMessage(HWND_BROADCAST, WM_MOUSEHOOKMSG, wParam, lParam);
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
//Erstmal Hook installieren
//First install the hook
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
//Uebergebenes Fensterhandle sichern
//Save the given window handle
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook;
end.
Also entweder ist die dll nicht richtig drin oder die Message wird an nen falsches fenster gesendet.
Ich weiß aber leider net was da falsch sein soll...

Relicted 23. Okt 2007 10:14

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
versuch mal bitte ob key's ankommen wenn du die in das vorhandene memo klimperst... also zusätzlich zu den die normal auch auftauchen :-)

wenn das klappt dann kanns sein dass wir gerade nen localen hook gebaut haben :-) für global brauchst du:

Delphi-Quellcode:
const
  WH_Keyboard_LL = 13;
//....
SetWindowsHookEx(WH_KEYBOARD_LL, //...
das problem hatte ich nämlich auch schon :-)


gruß
reli

1ceman 23. Okt 2007 10:28

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Ne passiert nix, also wird immer nur das eingegeben, was ich auch tippe...

Relicted 23. Okt 2007 10:41

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
mir fehlt auch irgendwie nen "installhook" :D

1ceman 23. Okt 2007 11:08

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Kann ich das so machen mit dem install hook, oder muss das in die getmessage procedure??
Delphi-Quellcode:
procedure TF_Netz_Server.B_ListenClick(Sender: TObject);
begin
  If B_Listen.Caption = 'Listen'
  Then begin
         ServerSocket.Port := SpE_Port.Value;
         ServerSocket.Open;
         Connections := 0;
         Timer.Enabled := True;
         B_Listen.Caption := 'Schließen';
         SpE_Port.Enabled := False;
         @InstallHook := GetProcAddress(lib, 'InstallHook');
       end
  Else begin
         ServerSocket.Close;
         B_Listen.Caption := 'Listen';
         Timer.Enabled := False;
         LB_Clients.Clear;
         LB_Clients.Items.Add('Clients');
         SpE_Port.Enabled := True;
         @UninstallHook := GetProcAddress(lib, 'UninstallHook')
         
       end;
end;

Relicted 23. Okt 2007 11:11

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
klar kannst das so machen... aaaaber:


Zitat:

Zitat von 1ceman
Delphi-Quellcode:
         SpE_Port.Enabled := False;
         @InstallHook := GetProcAddress(lib, 'InstallHook');
         InstallHook( self.handle );
       end

weil wenn du die funktion ned aufrufst passiert auch nix :-)

1ceman 23. Okt 2007 11:17

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Hmmm, da haste recht, hatte das oben irgendwie falsch verstanden was du meintest.
Das Problem ist nur, wenn ich
InstallHook( self.handle );
da hin mache, kommt immer die Fehlermeldung(hatte ich oben schonmal gepostet):
Zitat:

Project P_Netz_Server raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue.
Ka was da falsch läuft...

Phoenix 23. Okt 2007 11:21

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Zitat:

Zitat von Relicted
... oder statisch angeben...

Delphi-Quellcode:
procedure InstallHook(); external 'KeyboardHook.dll';

Versuch die Funktion mal so einzubinden wie relicted es schon gesagt hat.

Dann merkst Du wenigstens gleich schon beim Start, wenn er die DLL nicht findet / die Funktion nicht laden kann.

1ceman 23. Okt 2007 11:38

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
hmm wenn ich das oben einbinde kommt immer das:
Zitat:

[Error] U_Netz_Server.pas(72): Field definition not allowed after methods or properties
Also meine datei keyboardhook.dpr ist aber so richtig??oder hab ich da schon was falsch gemacht(also ich hab sie aus irgendeinem tutorial genommen und halt das mit dem sendmessage geändert)
Zu dem Sendmessage hab ich auch ne frage: und zwar habe ich
Delphi-Quellcode:
sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
genommen, ich hab das aber auch so gefunden:
Delphi-Quellcode:
sendmessage(HWND_BROADCAST, WM_KeyLogMessage, wParam, lParam);
jetzt würde ich gerne mal wissen was denn genau der unterschied ist zwischen HookHandle und HWND_BROADCAST.
Wenn ich das richtig verstanden habe, wird mit HWND_BROADCAST die message an alle top-level-fenster gesendet.
Was aber macht/bewirkt HookHandle??

Relicted 23. Okt 2007 11:42

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
hmmm hast du deine hoook.dll mal kompiliert? weil sonst kann der die dll auch nicht finden...

[Error] U_Netz_Server.pas(72): Field definition not allowed after methods or properties ->> mach die definition mal dahin wo du auch dein TINstallHook etc hinsteckst...

HookHandle ist glaube ich das handle von der hauptform... HWND_Broadcast schickt an alle fenster die meldung...

1ceman 23. Okt 2007 12:02

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
also habs sie kompiliert, das funktioniert auch.
wenn ich jetzt aus den Button Listen klicke kommt diese information:
Zitat:

Project C:\...\P_Netz_Server.exe faulted with message: 'Access violation at 0x009c5cc1: write of address 0x1a340042'. Process Stopped. Use Step or Run to continue.
hab die dll nochmal was geändert und das projekt auch, hier sind nochmal die aktuellen versionen:
Projekt:
Delphi-Quellcode:
unit U_Netz_Server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ScktComp, ExtCtrls, U_ASCII, Menus, Buttons, Winsock;

const
WM_KeyLogMessage = WM_USER + 23;

type
  TF_Netz_Server = class(TForm)
    ServerSocket: TServerSocket;
    SpE_Port: TSpinEdit;
    L_Port: TLabel;
    M_History: TMemo;
    E_Senden: TEdit;
    B_Senden: TButton;
    LB_Clients: TListBox;
    Timer: TTimer;
    B_Listen: TButton;
    RB_Key: TRadioButton;
    RB_Direkt: TRadioButton;
    RB_Kombi: TRadioButton;
    RB_Nichts: TRadioButton;
    Pop_ASCII: TPopupMenu;
    PopItem_ASCII: TMenuItem;
    BitB_Win_E: TBitBtn;
    B_Doppelpunkt: TButton;
    BitB_Win: TBitBtn;
    B_Slash: TButton;
    B_Backslash: TButton;
    B_Tab: TButton;
    B_Alt_F4: TButton;
    B_Shift_Tab: TButton;
    B_Alt_Tab: TButton;
    L_IP: TLabel;
    E_IP: TEdit;
    B_Strg_X: TButton;
    B_Strg_C: TButton;
    B_Strg_V: TButton;
    procedure TimerTimer(Sender: TObject);
    procedure B_ListenClick(Sender: TObject);
    procedure B_SendenClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RB_KeyClick(Sender: TObject);
    procedure RB_KeyKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure B_ListenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure B_SendenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure E_SendenKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure PopItem_ASCIIClick(Sender: TObject);
    procedure BitB_Win_EClick(Sender: TObject);
    procedure BitB_WinClick(Sender: TObject);
    procedure B_Alt_F4Click(Sender: TObject);
    procedure B_DoppelpunktClick(Sender: TObject);
    procedure B_SlashClick(Sender: TObject);
    procedure B_BackslashClick(Sender: TObject);
    procedure B_TabClick(Sender: TObject);
    procedure B_Shift_TabClick(Sender: TObject);
    procedure B_Alt_TabClick(Sender: TObject);
    function GetLocalIPs: String;
    procedure FormCreate(Sender: TObject);
    procedure B_Strg_XClick(Sender: TObject);
    procedure B_Strg_CClick(Sender: TObject);
    procedure B_Strg_VClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    protected
      procedure GotKeyMessage( var msg : TMessage ); message WM_KeyLogMessage;
  private
    { Private declarations }
    Connections: Integer;
    Keys_loggen: Boolean;
  public
    { Public declarations }
  end;


  TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
  TUninstallHook = function: Boolean; stdcall;
  procedure InstallHook(); external 'keyboardHook.dll';

var
  F_Netz_Server: TF_Netz_Server;
  UninstallHook: TUninstallHook;
  lib: Cardinal;

implementation

{$R *.dfm}

procedure TF_Netz_Server.GotKeyMessage( var msg : TMessage );
begin
M_History.Lines.Add(inttostr(msg.WParam));
M_History.Lines.Add(inttostr(msg.lParam));
end;

procedure TF_Netz_Server.B_ListenClick(Sender: TObject);
begin
  If B_Listen.Caption = 'Listen'
  Then begin
         ServerSocket.Port := SpE_Port.Value;
         ServerSocket.Open;
         Connections := 0;
         Timer.Enabled := True;
         B_Listen.Caption := 'Schließen';
         SpE_Port.Enabled := False;
         InstallHook;
       end
  Else begin
         ServerSocket.Close;
         B_Listen.Caption := 'Listen';
         Timer.Enabled := False;
         LB_Clients.Clear;
         LB_Clients.Items.Add('Clients');
         SpE_Port.Enabled := True;
         @UninstallHook := GetProcAddress(lib, 'UninstallHook')
       end;
end;

procedure TF_Netz_Server.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin                                          
  ServerSocket.Close;
end;

procedure TF_Netz_Server.FormCreate(Sender: TObject);
begin
  E_IP.Text := GetLocalIPs;
  lib := LoadLibrary('keyboardhook.dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    //InstallHook;
    //UnInstallHook;
  end; // else ERROR
end;

procedure TF_Netz_Server.FormDestroy(Sender: TObject);
begin
freelibrary(lib);
end;

end.
so und jetzt die dll:
Delphi-Quellcode:
library KeyboardHook;

uses
  Windows,
  Messages;

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;
  WM_KeyLogMessage: Cardinal = WM_USER + 23;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
      sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
//Erstmal Hook installieren
//First install the hook
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
//Uebergebenes Fensterhandle sichern
//Save the given window handle
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook;
end.
//Edit: Viele Dank für eure Hilfe.

Relicted 23. Okt 2007 12:12

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Delphi-Quellcode:
  TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
  TUninstallHook = function: Boolean; stdcall;
  procedure InstallHook(); external 'keyboardHook.dll';
so klappt das natürlich nicht...

Delphi-Quellcode:
  function InstallHook(Hwnd:THandle):boolean; stdcall; external 'keyboardHook.dll';
try this...

die parameter und rückgabewerte müssen natürlich übereinstimmen... das war nur als beispiel gemeint mit der procedure und nicht als lösung :-)

1ceman 23. Okt 2007 12:29

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
ja hab ich wohl falsch verstanden...hatte mich zwar irgendwie gewundert, aber mir gedacht, dass ich bestimmt falsch liege...

das Problem ist nur, dass es zwar jetzt läuft, also es kommen keine Fehlermeldungen mehr, aber es tut sich sonst auch net viel...

Relicted 23. Okt 2007 12:33

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
:gruebel: mit der fehlerbeschreibung kann ich leider nicht viel anfangen... da wird dann hilfe schwer... zip mal deinen quellcode und lad ihn hoch dann kann man mal reinschauen..

1ceman 23. Okt 2007 12:43

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok ist auch etwas komisch beschrieben, ich wollte nur sagen, dass es nicht funktioniert, also die Tastatue eingabe wird nicht in das Memo geschrieben.

So hab mal das ganze Projekt hochgeladen...Danke für die Hilfe

Relicted 23. Okt 2007 12:52

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
ok fehler gefunden...

Delphi-Quellcode:
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//es ist ebenfalls moeglich die Bearbeitung an eine Bedingung zu knuepfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
      sendmessage(WindowHandle, WM_KeyLogMessage, wParam, lParam);
in dem sendmessage stand HookHandle... is natürlich bullshit... muss windowhandle heißen...

ausserdem ist der

Delphi-Quellcode:
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
hook nur lokal (innerhalb deiner anwendung...
bitte wie vorhin beschrieben auf
Delphi-Quellcode:
    HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHookProc, HInstance, 0);
ändern und die message als const = 13 deklarieren... dann geht alles !


gruß
reli

1ceman 23. Okt 2007 13:05

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
erst nochmal vielen dank ;)

Hab das HookHandle in sendmessage zu WindowHandle geändert.
hab "HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHookProc, HInstance, 0);" eingefügt(ersetzt)

Nur das "ändern und die message als const = 13 deklarieren... dann geht alles ! " versteh ich net...
meinst du mit message WM_KeyLogMessage??

hab das jetzt einfach mal so gemacht (in der dll):
Delphi-Quellcode:
const
  WM_KeyLogMessage: Cardinal = 13;
aber leider funktioniert es immer noch net, oder ich bin einfach zu dumm...

Relicted 23. Okt 2007 13:07

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
neeeeee....

Delphi-Quellcode:
const
  WH_Keyboard_LL = 13;
wie ich vor ein paar posts schon geschrieben habe...

gruß
reli

1ceman 23. Okt 2007 13:33

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
asoooo...jetzt verstehe ich das ;)
Und es funktioniert...*freu*
Nochmal vielen vielen dank für deine Hilfe und Mühe...

Hab auch noch das Uninstall richtig gemacht und nen MouseHook eingebaut...funktionier alles super.

Relicted 23. Okt 2007 13:35

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
;-)

kein problem - dafür gibts dieses forum :-)


gruß
reli

1ceman 24. Okt 2007 08:38

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
so hab irgendwie noch nen kleines problem mit dem auswerten von wParam und lParam und ncode.
Also hab versucht xpos und ypos auszugeben, was auch funktioniert, aber nur solange die maus über der Form ist...
Ich hab folgenden Code in die funktion mousehookproc gepackt:
Delphi-Quellcode:
setprop(WindowHandle, 'mous_xpos', PMOUSEHOOKSTRUCT(lParam)^.pt.x);
setprop(WindowHandle, 'mous_ypos', PMOUSEHOOKSTRUCT(lParam)^.pt.y);
#

und in der form hab ich diese funtion:

Delphi-Quellcode:
procedure TF_Netz_Server.GotKeyMessage( var msg : TMessage );
var li:longint;
begin
li := longint(getprop(hwnd, 'mous_xpos'));
//getprop(hwnd, 'keyb_ncode');
M_History.Lines.Add(inttostr(li));
M_History.Lines.Add(inttostr(msg.lParam));
end;
Und ich vweiß auch nicht genau wie ich herausbekommen soll welche taste gedrückt wurde.

Relicted 24. Okt 2007 13:04

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
genau wie WH_Keyboard und WH_Keyboard_LL verhält sich das ganze mit der maus... die messages ohne _LL sind nur lokal - also innerhalb des programms.

take that:

Delphi-Quellcode:
const
  WH_Mouse_LL = 14;
gruß
reli

1ceman 24. Okt 2007 17:06

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
:wall: hätte ich auch selber drauf kommen können.

Hab aber direkt wieder ne frage, wie bekomm ich heraus welche taste gedrückt wurde(also bei tastatur und maus)??

//Edit:
Eigentlich sollte man über wParam herausbekommen, welche taste gedrückt wurde. Nur das war bei allen tasten das gleiche...
Dann hab ich mal nen bissl rumprobiert. Unter anderem habe ich das WH_KEYBOARD_LL in WH_KEYBOARD geändert und da ist mir aufgefallen, dass dann die richtigen wParam werte für die einzelnen Tasten geschickt werden(das problem ist halt nur, dass es nur geht, wenn die Form aktiv ist).
So dann habe ich oben unter const mal geguckt und da stand "WH_KEYBOARD_LL = 13;". Wenn ich das einfach wegnehme, dann mekcert delphi, weil es WH_KEYBOARD_LL nicht kennt.
Jetzt wollt ich fragen, wie ich WH_KEYBOARD_LL und WH_MOUSE_LL deklarieren muss, damit das funktioniert.

//Edit2:
Hab auch noch ne andere Frage.
und zwar was bedeutet/bewirkt das @ in folgender Zeile:
Delphi-Quellcode:
Keyboard_HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
mfg
1ceman

1ceman 26. Okt 2007 07:12

Re: PC-Aktionen an mehrere PCs im Netzwerk senden
 
*push*

hat keiner ne idee woran das liegen könnte??

//Edit
Also hab nochmal gesucht und herausgefunden dass ich es richtig ist, wenn man WH_MOUSE_LL und WH_KEYBOARD_LL so deklarieert:
Delphi-Quellcode:
const
 WH_MOUSE_LL = 14;
 WH_KEYBOARD_LL = 13;
(also so wie Relicted das vorher schonmal geschrieben hatte)

Das Problem ist nur, dass ich dann bei alle Tastatur eingaben folgenden Werte bekomme:
Down: lParam = 1244868; wParam=256
Up: lParam = 1244868; wParam=257
Wenn ich allerdings WH_MOUSE und WH_KEYBOARD verwende, dann bekomme ist die richtigen Werte für wParam und lParam zurück...allerdings nur solange ich in der Form bin...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 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