C/Visual C - Cerrar programa

 
Vista:

Cerrar programa

Publicado por evth_sux (14 intervenciones) el 17/04/2006 11:14:54
Hola,

Quisiera saber si existe alguna función que cierre una aplicación externa a mi programa en Visual C++. Con ShellExecute, si no me equivoco, se puede ejecutar un programa. ¿Hay alguna función con la que se pueda cerrar alguno de los programas abiertos?

Quiero hacer un programa para ejecutar y/o cerrar una aplicación a cierta hora.

Muchas gracias y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Cerrar programa

Publicado por MrX (63 intervenciones) el 17/04/2006 16:19:58
si, si hay, pero el codigo anda por algun lugar de mi hd... por lo menos ya sabes que hay... bueno aparte... hay una funcion que encuentra ventanas por el caption, algo como FindWindow(, "TEXTO"), no recuerdo bien, despues de obtenerla la cierras, creo que tambien te puede servir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cerrar programa

Publicado por fernando.gomez (1603 intervenciones) el 17/04/2006 17:38:57
Más o menos. Con GetDesktopWindow obtienes el HWND de la ventana padre de todo Windows. De ahí, haces un GetWindow con el HWND del escritorio para obtener un HWND de todas las ventanas hijas del escritorio, que entre otras, serían las ventanas principales de la aplicación. Cuando encuentres la ventana que buscas, le envías un mensaje WM_CLOSE y listo.

El siguiente código lo empleo para cerrar el explorador de archivos en una Pocket PC.

HWND hDesktop;
HWND hCurrent;
TCHAR szWinName[50];

memset(szWinName, 0, 50);

hDesktop = ::GetDesktopWindow();
for (hCurrent = ::GetWindow(hDesktop, GW_HWNDFIRST);
hCurrent != NULL;
hCurrent = ::GetWindow(hCurrent, GW_HWNDNEXT))
{
::GetWindowText(hCurrent, szWinName, 50);
if (!_tcscmp(szWinName, _T("File Explorer")))
{
::SendMessage(hCurrent, WM_CLOSE, NULL, NULL);
}
}

lo que hace el anterior código -probado con Embedded Visual C++ 4- es obtener el handle del escritorio, e iterar sobre todas las ventanas hijas. La comparación la hago a nivel del nombre de la ventana -en mi caso, File Explorer-, pero hay muchas otras formas de identificarlas (i.e. ID de proceso).

Ahora bien, si haces un ShellExecute y quieres terminar la aplicación que iniciaste, es mejor que emplees TerminateProcess, pasándole el ID de proceso que obtienes al hacer el ShellExecute.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cerrar programa

Publicado por evth_su (14 intervenciones) el 17/04/2006 19:16:44
Hola,

Pues con tu código no hace nada. Es decir, lo ejecuto, haciendo una pequeña modificación para que muestre los nombres de los procesos en un listbox, pero no reconoce ningún proceso abierto. No me añade ningún nombre al listbox. Te digo más, no hace caso de lo que hay dentro del bucle for.

Esto es lo que hice:

HWND hDesktop;
HWND hCurrent;
TCHAR szWinName[50];

memset(szWinName, 0, 50);

hDesktop = ::GetDesktopWindow();
for (hCurrent = ::GetWindow(hDesktop, GW_HWNDFIRST); hCurrent != NULL; hCurrent = ::GetWindow(hCurrent, GW_HWNDNEXT))
{
::GetWindowText(hCurrent, szWinName, 50);
m_lbLista.AddString (szWinName);
m_lbLista.AddString("Hola");
}
UpdateData (false);

Si saco el "Hola" fuera del bucle, justo antes del UpdateData, sí lo añade al listbox.

Yo uso Visual Studio 6.0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cerrar programa

Publicado por fernando.gomez (1603 intervenciones) el 18/04/2006 01:09:57
Este código no es para procesos, es para ventanas. Como dije, si quieres hacer algo con procesos directamente, tendrás que emplear TerminateProcess... sólo que tendrás que ingeniártelas para obtener el process id, que -si no es através del ShellExecute- es algo muy complicado de hacer...

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar