Es relativamente sencillo. La realidad es que el cursor ya cambia a IDC_APPSTARTING, pero podemos poner el que queramos.
Código:
DWORD WINAPI WaitForInputIdle(
__in HANDLE hProcess, // Handle del proceso que estamos creando
__in DWORD dwMilliseconds // Milisegundos de espera mínima para esta API
);
La API WaitForInputIdle, espera a que el proceso hProcess que estamos creando este completado o el tiempo establecido. Realmente la API se da por concluida cuando el proceso creado está en condiciones de esperar una respuesta por parte del usuario. Esto significa que no nos sirve para procesos de consola o sin cola de mensajes.
Un ejemplo práctico siguiendo el código expuesto en el hilo:
Código:
PROCESS_INFORMATION piProcInfo;
STARTUPINFOW siStartInfo;
// Set up members of STARTUPINFO structure.
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
HRESULT hRes = CreateProcessWithLogonW(
Usuario,
Dominio,
Password,
LOGON_WITH_PROFILE,
NULL,
App, // application name
NULL, // creation flags
NULL, // use parent's environment
L"C:\\", // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo // recive PROCESS_INFORMATION CreateProcessWithLogonW();
);
// Cambiamos el cursor a un rejoj de arena....
::SetCursor(LoadCursor(0, IDC_WAIT));
// Esperamos hasta que termine de crearse el nuevo proceso
WaitForInputIdle(piProcInfo.hProcess, INFINITE);
// Recuperamos el cursor estandar.
::SetCursor(LoadCursor(0, IDC_ARROW));
if(hRes){
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
}
Saludos.