![]() |
Re: Minimieren/Schließen einer Anwendung verhindern
Dass das Handle alleine nicht reicht ist mir klar. Ich stellte mir eher sowas vor wie:
function HandleToForm(Handle: HWND): TForm; |
Re: Minimieren/Schließen einer Anwendung verhindern
Zitat:
Es könnte aber gut sein, daß man dank der RTTI des Zielprogramms dennoch dran kommt. Allerdings stelle ich mir das nicht allzu einfach vor. |
Re: Minimieren/Schließen einer Anwendung verhindern
Okay, ich habe es jetzt mal mit einem globalen Fensterhook über eine DLL versucht :
DLL :
Delphi-Quellcode:
Hauptprogramm (das wichtige) :
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.
Delphi-Quellcode:
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.
[...]
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; |
Re: Minimieren/Schließen einer Anwendung verhindern
Keiner eine Idee, wo der Fehler liegen könnte? :/
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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-2025 by Thomas Breitkreuz