AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Minimieren/Schließen einer Anwendung verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Minimieren/Schließen einer Anwendung verhindern

Ein Thema von DarkLord0 · begonnen am 14. Sep 2005 · letzter Beitrag vom 22. Sep 2005
Antwort Antwort
Seite 2 von 2     12   
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#11

Re: Minimieren/Schließen einer Anwendung verhindern

  Alt 18. Sep 2005, 08:04
Dass das Handle alleine nicht reicht ist mir klar. Ich stellte mir eher sowas vor wie:
function HandleToForm(Handle: HWND): TForm;
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#12

Re: Minimieren/Schließen einer Anwendung verhindern

  Alt 18. Sep 2005, 09:29
Zitat von tigerman33:
Dass das Handle alleine nicht reicht ist mir klar. Ich stellte mir eher sowas vor wie:
function HandleToForm(Handle: HWND): TForm;
Dürfte nicht gehen, da es keine sinnvolle Methode gibt diese beiden miteinander zu verbinden. Das einzige wäre wohl das Rumstochern im Speicher *g*

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.
  Mit Zitat antworten Zitat
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
DarkLord0

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

Re: Minimieren/Schließen einer Anwendung verhindern

  Alt 22. Sep 2005, 10:33
Keiner eine Idee, wo der Fehler liegen könnte? :/
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr.
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