Ok ho risolto creando a mano il processo con CreateProcess, ma qualcosa non va.
La finestra che voglio aprire, purtroppo, non sembra funzionare.
Sto provando con un semplice notepad per vedere come spostare la posizione:
codice:
HWND desktop = GetDesktopWindow();
HWND childwindow;
DWORD ProcessID;
PROCESS_INFORMATION ProcInfo;
STARTUPINFO si;
unsigned int x;
unsigned int y;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
CreateProcess(NULL,"notepad.exe",NULL,NULL,false,0,NULL,NULL,&si,&ProcInfo);
childwindow = GetWindow(desktop,GW_CHILD);
while (childwindow != NULL)
{
GetWindowThreadProcessId(childwindow,&ProcessID);
if ( ProcessID == ProcInfo.dwProcessId )
break;
childwindow = GetWindow(childwindow,GW_HWNDNEXT);
}
if (childwindow == NULL)
return; //Il software non è stato aperto. Non dovrebbe mai accadere.
// CloseHandle(ProcInfo.hProcess); //Devo chiuderli??
// CloseHandle(ProcInfo.hThread);
x = GetSystemMetrics(SM_CXSCREEN);
y = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(childwindow,HWND_TOP,0,0,x-100,y-100,SWP_SHOWWINDOW);
Se premo sul notepad, una volta completato, appare solo una schermata nera che non funziona (il sistema non si blocca, comunque).
Sia se chiudo o non chiudo i 2 handle (comunque da una ricerca su msdn sembra che debbano essere chiusi poichè non rappresentano il processo in se e per se, ma è solo un riferimento).
Altra cosa strana: se vado in debug e faccio aprire il processo, ovviamente il notepad salta sul desktop avanti Visual Studio.
Per continuare il debug ovviamente sposto la mia attenzione sulla finestra di Visual Studio e continuo a debuggare, e il tutto continua.
Se invece avvio il programma senza debug, mi appare semplicemente il notepad e non sembra fare i suoi compiti (inutili i breakpoints: l'ultimo funzionante è sul confronto degli ID dei processi).
La finestra, ad ogni modo, sembra ignorare anche chiamate del tipo ShowWindow e SetWindowText