Einzelnen Beitrag anzeigen

DarkLord0

Registriert seit: 31. Okt 2004
59 Beiträge
 
#13

Re: Minimieren/Schließen einer Anwendung verhindern

  Alt 18. Sep 2005, 13:51
Okay, ich habe es jetzt mal mit einem globalen Fensterhook über eine DLL versucht :

DLL :
Delphi-Quellcode:
library wmsgcatch;

uses
  Windows,
  Messages;

const
mymsg='HNOTICERS';

var
HookHandle:Cardinal;
TargetWindowHandle:Cardinal;
OwnWindowHandle:Cardinal;
WM_HNOTICE1 : Cardinal = 0;

function GetMsgProc(code: integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
begin
WM_HNOTICE1:=RegisterWindowMessage(mymsg); //Damit zu Testzwecken dem Hauptprogramm eine Nachricht geschickt werden kann
setprop(OwnWindowHandle,mymsg,WM_HNOTICE1); //WM_HNOTICE1 übergeben
    with Windows.PMsg(lParam)^ do begin
    if ((message = WM_CLOSE)or(message=WM_QUERYENDSESSION)or(message=WM_MOUSEMOVE)) then begin //WM_MOUSEMOVE habe ich nur drin, um zu testen, ob das Hauptprogramm überhaupt benachrichtigt wird
     SendMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam); //Das Hauptprogramm benachrichtigen
     PostMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam); // Ich verwende sowohl SendMessage als auch PostMessage, um auszuschließen, dass es mit einer der beiden Funktionen Probleme gibt
      if (hwnd=TargetWindowHandle) then begin //Wenn es sich um Das Handle des zu 'schützenden' Fensters handelt
      SendMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
      PostMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
      pmsg(lparam).message:=WM_NULL; //Nachricht abbrechen
      end;end; end;
Result := CallNextHookEx(HookHandle, Code, wparam, lparam);

end;

function InstallHooks(Hwnd: Cardinal;OwnHwnd:Cardinal): Boolean; stdcall;
begin
TargetWindowHandle:=Hwnd; //Handle des zu schützenden Fensters
OwnWindowHandle:=OwnHwnd; //Handle des Hauptprogramm-Fensters

HookHandle := SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstance, {GetWindowThreadProcessId(TargetWindowHandle)}0); //Verwende erst einmal 0
Result:=Hookhandle<>0;
end;

function UninstallHooks: Boolean; stdcall;
begin
result:=UnHookWindowsHookEx(HookHandle);
end;

exports
  InstallHooks,
  UninstallHooks;

begin

end.
Hauptprogramm (das wichtige) :
Delphi-Quellcode:
[...]
type
procedure WndProc(var Mess:TMessage);override;
[...]
var
  Form1: TForm1;
  WM_HNOTICE1 : Cardinal = 0;

const
mymsg='HNOTICERS';

implementation
 function InstallHooks(Hwnd: THandle;OwnHwnd:Cardinal): Boolean; stdcall;
 external 'wmsgcatch.dll';
  function UninstallHooks: Boolean; stdcall;
  external 'wmsgcatch.dll';

{$R *.dfm}

procedure TForm1.WndProc(var Mess:TMessage);
begin
WM_HNOTICE1:=getprop(application.handle,mymsg); //WM_HNOTICE holen (falls vorhanden)
if mess.msg=WM_HNOTICE1 then
memo1.Lines.add('Nachricht erhalten.');
inherited WndProc(Mess) ;
end;

function FindAWindow(WinCaption: string; WinClassName: string): THandle; //Funktion, um das WindowHandle des Zielprogramms herauszufinden (nicht selbstgeschrieben)
var WindowInfo: TFindWindowStruct;
begin
  with WindowInfo do begin
    caption := WinCaption;
    className := WinClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    result := WindowHandle;
  end;
end;

function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean;
stdcall;
var
  ProcessID: THandle;
begin
  ProcessID := 0;
  GetWindowThreadProcessID(AHandle, ProcessID);
  Result := not (ProcessID = LParam);
  if not Result then
    WindowHandle := AHandle;
end;

procedure TForm1.FormCreate(Sender: TObject);
var targethandle:thandle;
begin
[... (Programm mit ShellExecute starten und targethandle mit FindAWindow beschaffen)]
postmessage(targethandle,WM_SYSCOMMAND,SC_MAXIMIZE,0);
SetForegroundWindow(targethandle); //Maximieren und in den Vordergrund (funktioniert bereits)
if InstallHooks(targethandle,application.handle) then //Hooks installieren.
label1.Caption:='Installed Successfully.';
end;
Leider funktioniert das nicht so wie es soll. Das Hauptprogramm bekommt zwar Nachrichten, wenn ich WH_MOUSEMOVE benutze, aber nicht bei WM_QUERYENDSESSION und WH_CLOSE. Wenn ich die DLL nur Nachrichten senden lasse, wenn hwnd=TargetWindowHandle ist, bekommt das Hauptprogramm noch nicht einmal bei WH_MOUSEMOVE Nachrichten.
  Mit Zitat antworten Zitat