c++ - vago - la ventana abierta saki audio
Cómo obtener hWnd de la ventana abierta por ShellExecuteEx.. hProcess? (1)
Este tema "simple" parece estar plagado de problemas.
p.ej. ¿El nuevo proceso abre múltiples ventanas? ¿Tiene una pantalla de bienvenida?
¿Hay una manera simple? (Estoy comenzando una nueva instancia de Notepad ++)
...
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?
}
...
Primero use WaitForInputIdle
para pausar su programa hasta que la aplicación haya comenzado y esté esperando la entrada del usuario (la ventana principal debería haberse creado para entonces), luego use 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.....
}