PDA

Ver la Versión Completa : Restaurar otra aplicacion y no morir en el intento


Edgtho
17-03-2008, 21:02:38
Recupero el hilo iniciado hace ya dos años aqui
http://www.clubdelphi.com/foros/showthread.php?t=30403&highlight=sw_restore


Por que me encuentro en la misma tesitura. Cuando ejecutas

ShowWindow(hApp, SW_RESTORE);


donde hApp es el handle de la otra aplicacion, parece que funciona pero el boton minimizar se queda muerto total.

Aqui os dejo tooodas las combinaciones posibles que he intentado rebuscando entre foros


var
hApp: Cardinal;
FgThreadId : DWORD;
AppThreadId : DWORD;
begin
hApp := fmMain.FindWindowByTitle([titulo aplicacion]);

// SendMessage(hApp,CM_RESTORE,0,0);
// ShowWindow(hApp, SW_SHOW); //despues la aplicacion no puede minimizarse;
// ShowWindow(hApp, SW_SHOWNORMAL); //despues la aplicacion no puede minimizarse;

FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(hApp, nil);
AttachThreadInput(AppThreadId, FgThreadId, true);

ShowWindow(hApp, SW_RESTORE); // despues la aplicacion no puede minimizarse;
SetForegroundWindow(hApp);
AttachThreadInput(AppThreadId, FgThreadId, false);

//SetForeGroundWindow(hApp);
// PostMessage(hApp,CM_RESTORE,0,0);
// SendMessage(hApp,WM_ACTIVATE,0,0);
// SendMessage(hApp,SW_RESTORE,0,0);
// SendMessage(hApp,CM_RESTORE,0,0);
//Application.ProcessMessages;



Si es que no puede ser tan dificil pero no hay manera de encontrarlo, solo fijaros en lo extravagante de mi ultimo intento (lineas no comentadas). Si me podeis ayudar os lo agradecere un webo y parte del otro.

un saludo

cHackAll
17-03-2008, 21:31:28
SendMessage(FindWindow(nil, 'Untitled - Notepad'), WM_SYSCOMMAND, SC_RESTORE, 0);

keyboy
17-03-2008, 21:50:07
Yo probaría esta función:


procedure ActivarAplicacion(Handle: HWnd);
var
FgThreadId : DWORD;
AppThreadId : DWORD;

begin
if IsIconic(Handle) then
ShowWindow(Handle, SW_RESTORE)
else
begin
FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(Handle, nil);

AttachThreadInput(AppThreadId, FgThreadId, true);
SetForegroundWindow(Handle);
AttachThreadInput(AppThreadId, FgThreadId, false);
end;
end;


Handle debe ser el handle de la aplicación y no de la ventana principal.

Bye

Edgtho
18-03-2008, 08:40:46
KeyBoy lo que habias puesto era lo mismo que tenia yo, jejeje. La respuesta me la ha dado chackall, enviandole el comando SC_RESTORES justo antes del ShowWindow ha funcionado sin problemas.



hApp := fmMain.FindWindowByTitle([titulo aplicacion]);
SendMessage(hApp, WM_SYSCOMMAND, SC_RESTORE, 0);
ShowWindow(hApp, SW_RESTORE);



Mil gracias

keyboy
19-03-2008, 06:34:20
Curioso, porque yo hago esa misma pueba y no funciona. En fin, cada Windows es un mundo.

Bye