AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi PC-Aktionen an mehrere PCs im Netzwerk senden
Thema durchsuchen
Ansicht
Themen-Optionen

PC-Aktionen an mehrere PCs im Netzwerk senden

Ein Thema von 1ceman · begonnen am 22. Okt 2007 · letzter Beitrag vom 26. Okt 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#1

PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 22. Okt 2007, 12:58
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.
Roman
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 22. Okt 2007, 13:10
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
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 22. Okt 2007, 13:28
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#4

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 22. Okt 2007, 13:44
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#5

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 09:17
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 )

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.
Roman
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 09:22
es muss folgendermaßen heißen:

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

... oder statisch angeben...

procedure InstallHook(); external 'KeyboardHook.dll'; gruß
reli
  Mit Zitat antworten Zitat
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#7

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 09:57
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???
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
Roman
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 10:06
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
  Mit Zitat antworten Zitat
1ceman

Registriert seit: 16. Dez 2005
Ort: Odenthal
134 Beiträge
 
Delphi 6 Personal
 
#9

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 11:08
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...
Roman
  Mit Zitat antworten Zitat
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: PC-Aktionen an mehrere PCs im Netzwerk senden

  Alt 23. Okt 2007, 11:14
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 14:30 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