Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Minimize einer anderen Application blocken (https://www.delphipraxis.net/36361-minimize-einer-anderen-application-blocken.html)

Shrek_III 18. Dez 2004 23:23


Minimize einer anderen Application blocken
 
So, ich hab jetzt schon seit fast zwei Tagen vergeblich gesucht und wohl einfach nicht die richtigen Schlagworte gefunden - könnte natürlich evtl. auch sein, daß das Thema hier bisher noch nicht bearbeitet wurde...

Ausgangssituation:

Eine selbstgeschriebene Delphi-Applikation soll das automatische Minimize eines anderen Programms (Diablo II) unterdrücken. Für alle, die es nicht kennen: Diablo II im Fenstermodus [ -w ] gestartet minimiert sich sofort, wenn es nicht mehr den Fokus besitzt und verschwindet damit in die Taskleiste. Dieses Verhalten möchte ich aus meinem Programm heraus unterbinden, handle, ProcessID oder ähnliches von D2 zu bekommen ist kein Problem, aber das Minimieren zu verhindern habe ich bisher nicht hinbekommen.


eigene Lage:
Windows 2000
Delphi 2005 - Architekt (was aber wohl denke ich mal egal sein dürfte)


Feindlage:
Diablo II (auf DirectX basierend <- vielleicht gibt das ja nochmal einen Hinweis)


Auftrag:
Schalten Sie das automatische Minimize ab.


Unterstützung:
Hoffentlich aus dem Forum - auch wenn dies mein 1st Post ist.


Melde mich ab

Sprint 18. Dez 2004 23:29

Re: Minimize einer anderen Application blocken
 
Zitat:

Zitat von Shrek_III
Diablo II im Fenstermodus [ -w ] gestartet minimiert sich sofort, wenn es nicht mehr den Fokus besitzt und verschwindet damit in die Taskleiste.

Fenster subclassen und WM_KILLFOCUS abfangen.

Shrek_III 19. Dez 2004 10:59

Re: Minimize einer anderen Application blocken
 
Auch wenn ich es gerne so hätte, aber ich glaube, daß dem Problemchen nicht so einfach beizukommen ist...

Zitat:

GWL_WNDPROC
Sets a new address for the window procedure.

Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
MSDN-Library durchsuchenSetWindowLong

Also habe ich auch mit meinem Code
Code:
function EditD2Window (hD2Win, uMsg, wParam, lParam: DWORD): DWORD; stdcall;
var
  messagefound : boolean;
begin
  messagefound := false;
  CASE uMsg of
    WM_KILLFOCUS: begin
                    messagefound := true;
                  end;
  end;
  if messagefound = false then Result := CallWindowProc(@OldWinProc,hD2Win,uMsg,wParam,lParam)
  else result := 0;
end;


...
begin
  ...
  OldWinProc := SetWindowLong (GeneralD2Handle, GWL_WNDPROC, Integer (@EditD2Window));
end;
wenig Chancen.


oder mache ich da grundsätzlich etwas falsch?!?

Sprint 19. Dez 2004 12:15

Re: Minimize einer anderen Application blocken
 
Zitat:

Zitat von Shrek_III
Zitat:

GWL_WNDPROC
Sets a new address for the window procedure.

Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
MSDN-Library durchsuchenSetWindowLong

Also habe ich auch mit meinem Code wenig Chancen.

Also wenn das nur für dich sein soll, dann erstelle eine DLL mit der SubClass Routine und injiziere diese mit den Funktionen die bei Madshi's madCollection mit dabei sind. Das ist der einfachste Weg.


Edit: Oder versuche mit SetWindowsHookEx die Windows Message abzufangen.

Shrek_III 19. Dez 2004 15:35

Re: Minimize einer anderen Application blocken
 
Hallo,
erstmal nochmals Danke für Deine Antwort, ich versuche es zunächst mit dem SetWindowsHookEx.

Beim Stöbern in diesem Forum habe ich da auch einen Beitrag von Dir gefunden...

Code zum Thema abfangen von WM_CLOSE bzw. WM_QUIT


daraus habe ich dann folgendes gemacht:

Code:
 

function EditD2Window (Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  Msg: PMsg;
begin

  if Code = HC_ACTION then
  begin
    Msg := PMsg(lParam);
    if Msg^.message = WM_KILLFOCUS then
    begin
      Msg^.message := WM_COMMAND;
      Msg.wParam := WM_NULL;
      Msg.lParam := 0;
      Result := 1;
      Exit;
    end;

  end;

  Result := CallNextHookEx(MsgHook, Code, wParam, lParam);
end;



begin
...
  ProcId := GetWindowThreadProcessId (GeneralD2Handle, ProcId);
  MsgHook := SetWindowsHookEx (WH_GETMESSAGE, @EditD2Window, 0, ProcId);
...
end;
wobei GeneralD2Handle definitiv das richtige Handle und ProcId die richtige ProzessId zu meinem D2-Fenster ist.

Funktionieren will das Ganze aber dennoch nicht - irgendwelche Verbesserungsvorschläge?

Sprint 19. Dez 2004 20:47

Re: Minimize einer anderen Application blocken
 
Zitat:

Zitat von Shrek_III
Beim Stöbern in diesem Forum habe ich da auch einen Beitrag von Dir gefunden...

Das Beispiel war auf die eigene Anwendung bezogen.

Zitat:

Funktionieren will das Ganze aber dennoch nicht - irgendwelche Verbesserungsvorschläge?
Egal ob du dich für's Subclassen oder für einen Hook entscheiden tust, das erstellen einer DLL bleibt dir wohl nicht erspart.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 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