Título: Cerrar todas las Ventanas (C/S Taskkill) Publicado por: Dessa en 7 Enero 2009, 21:23 pm Con este código intento cerrar todas Aplicaciones (no procesos) con ventanas (visibles con y sin bordes) que se encuentran abiertas, con el Api SendMesssage (que me permite guardar los cambios) o con Taskkill (que cierra todo sin pedir permiso, ignorando todos los cambios), por lo tanto no se olviden de guardar todo antes de aplicar con Taskkill.
La pregunta es como puedo evitar que se cierre el explorer cuando tengo que cerrar las pantallas sin bordes, para no tener que ejecutarlo de nuevo al final ?, Private Sub Command1_Click() EnumWindows AddressOf EnumWindowsProc, ByVal 0& If Check1.Value = 1 Then Dim x As Long: x = GetTickCount: While GetTickCount < x + 500: Wend Shell "explorer.exe" End If End Sub No doy con la clase del explorer para poder agregarla al if de EnumWindowsProc Public Function EnumWindowsProc(ByVal Hwnd As Long, ByVal lParam As Long) As Boolean If TaskWindow(Hwnd) Then If GetClsName(Hwnd) <> "Shell_TrayWnd" or GetClsName(Hwnd) <> "Classe_explorer" Then ... ... ... EnumWindowsProc = True End Function Nota1: Hay que compilar y guardar para ejecutarlo Nota2: CTL-ALT-SUP (Aministrador, aplicaciones, tarea neva..., explorer, aceptar) si hace falta volver el explorer Formulario Código:
Módulo Código:
Sauludos Título: Re: Cerrar todas las Ventanas (C/S Taskkill) (SRC) Publicado por: krackwar en 7 Enero 2009, 22:29 pm Solo como critica constructiva empieza a usar apis y deja el batch ;)
Título: Re: Cerrar todas las Ventanas (C/S Taskkill) (SRC) Publicado por: Dessa en 7 Enero 2009, 22:58 pm Siempre son bienvenidas las criticas constructivas krackwar y siempre uso APIs (o por lo menos lo intento) pero en este caso que nesecito cerrar todo abuptamente "Taskkill" esta respondiendo perfecto con y sin bordes. (sendMesagge no responde sin bordes), por otro lado solo estoy probando con hasta donde puede llegar "Taskkill", pero si me das una buena razon para descartarla seria la mejor critica constructiva. (y por supuesto que aceptaria)
PD: Alguna idea para encontrar la classe del explorer ? (para no tener que ejecutarlo al final de EnumWindowsProc) Saludos de Dessa Título: Re: Cerrar todas las Ventanas (C/S Taskkill) (SRC) Publicado por: krackwar en 7 Enero 2009, 23:09 pm Siempre son bienvenidas las criticas constructivas krackwar y siempre uso APIs (o por lo menos lo intento) pero en este caso que nesecito cerrar todo abuptamente "Taskkill" esta respondiendo perfecto con y sin bordes. (sendMesagge no responde sin bordes), por otro lado solo estoy probando con hasta donde puede llegar "Taskkill", pero si me das una buena razon para descartarla seria la mejor critica constructiva. (y por supuesto que aceptaria) PD: Alguna idea para encontrar la classe del explorer ? (para no tener que ejecutarlo al final de EnumWindowsProc) Saludos de Dessa Ok , te digo las razones , taskkill por si no lo sabes es un exe que se encuentra en system32 , si le cambias el nombre te jode este codigo , al llamar a otro exe estas cargando mas el pobre pc , si hay algun error en cerrar tu no lo sabes exepto que leyeras lo que devuelve pero ene ste caso no lo lees , esas son las razoneds ;) Título: Re: Cerrar todas las Ventanas (C/S Taskkill) (SRC) Publicado por: Dessa en 7 Enero 2009, 23:39 pm Tendre muy en cuenta esa buena razon, y seguire probando para ver en la practica hasta donde se puede, en maquinas altas hasta ahora no tube errores, voy a empezar a probar con P-III. Si no sirve el primero que la descartará sere yo.
Si se te ocurre algo para el explorer por favor me lo pasas Saludos ;) Título: Re: Cerrar todas las Ventanas (C/S Taskkill) (SRC) Publicado por: Dessa en 8 Enero 2009, 15:54 pm Ok , te digo las razones , taskkill por si no lo sabes es un exe que se encuentra en system32 , si le cambias el nombre te jode este codigo , ;) Solo pòr curiosidad intenta cambiar el nombre de taskkill en system32 y luego lo llamas desde vb o desde la consola, notaras que taskkill se sigue ejecutando, por otro lado no te olvides que las Apis dependen de las DLLs en que se encuentren sus funciones, tambien se pueden borrar o cambiarle el nombre y se te caga el code que las llama. Saludos ;) Título: Re: Cerrar todas las Ventanas (C/S Taskkill) Publicado por: [Zero] en 8 Enero 2009, 16:02 pm Jaja, bueno es raro que alguien cambie el nombre de la kernel32 :o :rolleyes:
Las apis son más rápidas, con manejo de errores y dan más posibilidades ;). Saludos Título: Re: Cerrar todas las Ventanas (C/S Taskkill) Publicado por: Dessa en 8 Enero 2009, 16:13 pm Coincido que es raro que alguien queira cambiarle el nombre a las DLL ( no a kernel32) y tambien es raro que quiera cambiarle el nombre a Taskkill, tambien coincido con que las funciones Apis (que siempre intento utilizar) son mas rápidas, pero este mensaje no es una discución sobre eso, mi pregunta en este mensaje es como puedo cerrar las ventanas sin borde sin que se cierre el Explorer. exe (para no tener que ejecutarlo desde el código)
Título: Re: Cerrar todas las Ventanas (C/S Taskkill) Publicado por: el_c0c0 en 8 Enero 2009, 18:11 pm Coincido que es raro que alguien queira cambiarle el nombre a las DLL ( no a kernel32) y tambien es raro que quiera cambiarle el nombre a Taskkill, tambien coincido con que las funciones Apis (que siempre intento utilizar) son mas rápidas, pero este mensaje no es una discución sobre eso, mi pregunta en este mensaje es como puedo cerrar las ventanas sin borde sin que se cierre el Explorer. exe (para no tener que ejecutarlo desde el código) hace una lista de procesos criticos y omitilos al listarlos.. hablando de exes en memoria y no de handles de ventanas..saludos Título: Re: Cerrar todas las Ventanas (C/S Taskkill) Publicado por: Dessa en 8 Enero 2009, 18:20 pm Gracias por responder a la preguta el_c0c0 , ya habia probado con eso pero no responde.
Public Function EnumWindowsProc(ByVal Hwnd As Long, ByVal lParam As Long) As Boolean If TaskWindow(Hwnd) Then If GetClsName(Hwnd) <> "Shell_TrayWnd" Then Dim idProc As Long: Call GetWindowThreadProcessId(Hwnd, idProc) Dim Handle_Proceso As Long: Handle_Proceso = OpenProcess(&H400 + &H10, 0, idProc) Dim Buffer As String: Buffer = Space(255) Dim ret As Long: ret = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255) Dim ruta As String: ruta = Left(Buffer, ret) Call CloseHandle(Handle_Proceso) If Mid(ruta, InStrRev(ruta, "\") + 1) <> App.EXEName + ".exe" or Mid(ruta, InStrRev(ruta, "\") + 1) <> "EXPLORER.EXE" Then Shell "cmd.exe /c Taskkill /f /IM " + Mid(ruta, InStrRev(ruta, "\") + 1) End If End If End If Me está volviendo loco, saludos |