Delphi-PRAXiS
Seite 2 von 4     12 34      

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 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 :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.
Seite 2 von 4     12 34      

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