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:
Se premo sul notepad, una volta completato, appare solo una schermata nera che non funziona (il sistema non si blocca, comunque).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);
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

Rispondi quotando