![]() |
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 |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
Ne passiert nix, also wird immer nur das eingegeben, was ich auch tippe...
|
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
mir fehlt auch irgendwie nen "installhook" :D
|
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; |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
klar kannst das so machen... aaaaber:
Zitat:
|
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:
|
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
Zitat:
Dann merkst Du wenigstens gleich schon beim Start, wenn er die DLL nicht findet / die Funktion nicht laden kann. |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
hmm wenn ich das oben einbinde kommt immer das:
Zitat:
Zu dem Sendmessage hab ich auch ne frage: und zwar habe ich
Delphi-Quellcode:
genommen, ich hab das aber auch so gefunden:
sendmessage(HookHandle, WM_KeyLogMessage, wParam, lParam);
Delphi-Quellcode:
jetzt würde ich gerne mal wissen was denn genau der unterschied ist zwischen HookHandle und HWND_BROADCAST.
sendmessage(HWND_BROADCAST, WM_KeyLogMessage, wParam, lParam);
Wenn ich das richtig verstanden habe, wird mit HWND_BROADCAST die message an alle top-level-fenster gesendet. Was aber macht/bewirkt HookHandle?? |
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... |
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:
Projekt:
Delphi-Quellcode:
so und jetzt die dll:
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.
Delphi-Quellcode:
//Edit: Viele Dank für eure Hilfe.
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. |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
Delphi-Quellcode:
so klappt das natürlich nicht...
TInstallHook = function(Hwnd: THandle): Boolean; stdcall;
TUninstallHook = function: Boolean; stdcall; procedure InstallHook(); external 'keyboardHook.dll';
Delphi-Quellcode:
try this...
function InstallHook(Hwnd:THandle):boolean; stdcall; external 'keyboardHook.dll';
die parameter und rückgabewerte müssen natürlich übereinstimmen... das war nur als beispiel gemeint mit der procedure und nicht als lösung :-) |
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... |
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..
|
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 |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
ok fehler gefunden...
Delphi-Quellcode:
in dem sendmessage stand HookHandle... is natürlich bullshit... muss windowhandle heißen...
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); ausserdem ist der
Delphi-Quellcode:
hook nur lokal (innerhalb deiner anwendung...
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
bitte wie vorhin beschrieben auf
Delphi-Quellcode:
ändern und die message als const = 13 deklarieren... dann geht alles !
HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHookProc, HInstance, 0);
gruß reli |
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:
aber leider funktioniert es immer noch net, oder ich bin einfach zu dumm...
const
WM_KeyLogMessage: Cardinal = 13; |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
neeeeee....
Delphi-Quellcode:
wie ich vor ein paar posts schon geschrieben habe...
const
WH_Keyboard_LL = 13; gruß reli |
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. |
Re: PC-Aktionen an mehrere PCs im Netzwerk senden
;-)
kein problem - dafür gibts dieses forum :-) gruß reli |
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:
Und ich vweiß auch nicht genau wie ich herausbekommen soll welche taste gedrückt wurde.
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; |
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:
gruß
const
WH_Mouse_LL = 14; reli |
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:
mfg
Keyboard_HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
1ceman |
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:
(also so wie Relicted das vorher schonmal geschrieben hatte)
const
WH_MOUSE_LL = 14; WH_KEYBOARD_LL = 13; 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 00:19 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