Riduci a icona un'applicazione esterna con Delphi
Domanda
Esiste un modo per ridurre a icona un'applicazione esterna da cui non ho il controllo dall'interno della mia applicazione Delphi?
ad esempio notepad.exe, ad eccezione dell'applicazione che voglio minimizzare avrà sempre e solo un'istanza.
Soluzione
Puoi utilizzare Trova finestra per trovare l'handle dell'applicazione e Mostra finestra per minimizzarla.
var
Indicador :Integer;
begin
// Find the window by Classname
Indicador := FindWindow(PChar('notepad'), nil);
// if finded
if (Indicador <> 0) then begin
// Minimize
ShowWindow(Indicador,SW_MINIMIZE);
end;
end;
Altri suggerimenti
Non sono un esperto di Delphi, ma se puoi invocare API Win32, puoi utilizzare FindWindow e ShowWindow per ridurre a icona una finestra, anche se non appartiene alla tua app.
Grazie per questo, alla fine ho usato una versione modificata di Neftali's codice, l'ho incluso di seguito nel caso in cui qualcun altro abbia gli stessi problemi in futuro.
FindWindow(PChar('notepad'), nil);
restituiva sempre 0, quindi mentre cercavo un motivo per cui ho trovato questo funzione che avrebbe trovato l'hwnd e che ha funzionato a meraviglia.
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
NextHandle: Hwnd;
NextTitle: array[0..260] of char;
begin
// Get the first window
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
while NextHandle > 0 do
begin
// retrieve its text
GetWindowText(NextHandle, NextTitle, 255);
if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
begin
Result := NextHandle;
Exit;
end
else
// Get the next window
NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
end;
Result := 0;
end;
procedure hideExWindow()
var Indicador:Hwnd;
begin
// Find the window by Classname
Indicador := FindWindowByTitle('MyApp');
// if finded
if (Indicador <> 0) then
begin
// Minimize
ShowWindow(Indicador,SW_HIDE); //SW_MINIMIZE
end;
end;
Suppongo che FindWindow (PChar ('notepad'), zero) dovrebbe essere FindWindow (zero, PChar ('notepad')) per trovare la finestra per titolo.