2010-07-16 17 views
7

Este problema "simple" parece estar plagado de problemas.
por ej. ¿El nuevo proceso abre múltiples ventanas? ¿Tiene una pantalla de bienvenida?
¿Hay una manera simple? (Estoy empezando una nueva instancia de Notepad ++)Cómo obtener hWnd de la ventana abierta por ShellExecuteEx .. hProcess?

... 
std::tstring tstrNotepad_exe = tstrProgramFiles + _T("\\Notepad++\\notepad++.exe"); 

SHELLEXECUTEINFO SEI={0}; 
sei.cbSize  = sizeof(SHELLEXECUTEINFO); 
sei.fMask  = SEE_MASK_NOCLOSEPROCESS; 
sei.hwnd   = hWndMe; // This app's window handle 
sei.lpVerb  = _T("open"); 
sei.lpFile  = tstrNotepad_exe.c_str();  
sei.lpParameters = _T(" -multiInst -noPlugins -nosession -notabbar "; 
sei.lpDirectory = NULL; 
sei.nShow  = SW_SHOW; 
sei.hInstApp  = NULL;  
if(ShellExecuteEx(&sei)) 
{ // I have sei.hProcess, but how best to utilize it from here? 
} 
... 

Respuesta

12

Primer uso WaitForInputIdle para pausar su programa hasta que se ha iniciado la aplicación y espera la entrada del usuario (la ventana principal debería haber sido creado por entonces), luego usar EnumWindows y GetWindowThreadProcessId para determinar qué ventanas del sistema pertenecen al proceso creado.

Por ejemplo:

struct ProcessWindowsInfo 
{ 
    DWORD ProcessID; 
    std::vector<HWND> Windows; 

    ProcessWindowsInfo(DWORD const AProcessID) 
     : ProcessID(AProcessID) 
    { 
    } 
}; 

BOOL __stdcall EnumProcessWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
    ProcessWindowsInfo *Info = reinterpret_cast<ProcessWindowsInfo*>(lParam); 
    DWORD WindowProcessID; 

    GetWindowThreadProcessId(hwnd, &WindowProcessID); 

    if(WindowProcessID == Info->ProcessID) 
     Info->Windows.push_back(hwnd); 

    return true; 
} 

.... 

if(ShellExecuteEx(&sei)) 
{ 
    WaitForInputIdle(sei.hProcess, INFINITE); 

    ProcessWindowsInfo Info(GetProcessId(sei.hProcess)); 

    EnumWindows((WNDENUMPROC)EnumProcessWindowsProc, 
     reinterpret_cast<LPARAM>(&Info)); 

    // Use Info.Windows..... 
} 
+0

Gracias Jon ... sondeo intervalo tan corto es el camino a seguir ... eso tiene sentido :) –

+0

estoy trabajando a través de su ejemplo ahora ... y una PD a mi comentario anterior: Acabo de notar en MSDN: WaitForInputIdle se puede utilizar en cualquier momento, no solo durante el inicio de la aplicación. Sin embargo, WaitForInputIdle espera solo una vez para que un proceso quede inactivo; las llamadas WaitForInputIdle posteriores regresan inmediatamente, ya sea que el proceso esté inactivo o ocupado. * Parece que las encuestas no son una buena idea ... Haré algunas pruebas. –

+0

Solo debe usar WaitForInputIdle cuando se crea el proceso. A partir de ese momento, solo realice una encuesta en la llamada de EnumWindows para obtener la lista de ventanas actualizada. –

Cuestiones relacionadas