![]() |
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. |
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. ![]() sollte eigentlich genug treffer geben :-) gruß reli |
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. |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
Zitat:
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. |
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:
Nur das funktioniert irgendwie nicht so richtig...
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; beim Aufruf von installhook kommt imer folgende Fehlermeldung: Zitat:
|
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
es muss folgendermaßen heißen:
Delphi-Quellcode:
man beachte das @
@InstallHook := GetProcAddress(lib, 'InstallHook');
... oder statisch angeben...
Delphi-Quellcode:
gruß
procedure InstallHook(); external 'KeyboardHook.dll';
reli |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
Danke das funktioniert.
Jetzt hab ich nur noch ne Frage:
Delphi-Quellcode:
ist diese zeile dafür zuständig, dass was an meine Form gesendet wird???
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;
Delphi-Quellcode:
Und wie kann ich die Message in meinem Hauptprogramm lesen/auswerten??
sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
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 |
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 |
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:
Also entweder ist die dll nicht richtig drin oder die Message wird an nen falsches fenster gesendet.
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. Ich weiß aber leider net was da falsch sein soll... |
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:
das problem hatte ich nämlich auch schon :-)
const
WH_Keyboard_LL = 13; //.... SetWindowsHookEx(WH_KEYBOARD_LL, //... gruß reli |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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 by Thomas Breitkreuz