e.CloseReason en Visual Basic 2010 WPF no funciona, ¿se puede hacer de alguna manera, saber por qué motivo se le a dicho a la aplicación que se cierre, y evitarlo si el motivo no es apagar? Lo necesito hacer, pero no se me ocurre nada...
gracias y saludos.
Edito: Tengo importado esto: Imports System.Windows.Forms.CloseReason
pero no hace nada, cuando la cierras, se cierra del todo, no lo cancela...
gracias y saludos.
1) ¿Estás trabajando con Windows Forms?
2) ¿Por qué importas una función que se encuentra en un evento? (En el caso que estés trabajando con Windows Forms).
Si logro entenderte, dices que quieres saber el motivo por el cual se ha dicho a la aplicación que se cierre, pues bien se puede saber con un simple MessageBox, en el evento FormClosing, junto a él dices que quieres evitar que se cierre tu aplicación si el motivo no es apagar, pues ni seguir hablando, te dejo el código de lo que pides.
Private Sub Formulario_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
MessageBox.Show(e.CloseReason.ToString()) 'Mostramos el motivo de cierre
If Not e.CloseReason = CloseReason.WindowsShutDown Then 'Si no es por motivo de cierre de sistema
e.Cancel = True 'Cancelamos el cierre
End If
End Sub
De igual manera si el usuario decide cerrarte la aplicación desde el administrador de tareas en la pestaña procesos, lo hará sin problema alguno. Por lo visto estás creando un especie de virus en vista de los temas que ya has creado, y no creo que te funcione muy bien si no te inyectas en algún proceso que no se pueda cerrar fácilmente. Tendrás que pensar un poco más allá de un simple e.Cancel = True, para lograr que el usuario no te cierre la aplicación desde el administrador de tareas.
Gruß.
estoy creando una aplicación que bloquee aplicaciones mediante código md5 checkum, es decir, que compruebe todo el tiempo cada aplicación, y mire cada ruta de proceso y compruebo el md5, si coincide con unas aplicaciones (especificadas desde la aplicación, y guardados los datos en el registro) cerrar el proceso de inmediato, pero por eso necesito evitar que mi aplicación se cierre, utilizo Visual Basic 2010, y he creado una aplicación WPF, por eso importo lo otro, no es una aplicación forms, el código que me diste fue el primero que probé, es el que utilizo en forms, pero en wpf no funciona, ¿se te ocurre algo para evitar que se pueda cerrar la aplicación?
muchas gracias y saludos
Cita de: Segurida en 26 Mayo 2011, 00:27 AM
estoy creando una aplicación que bloquee aplicaciones mediante código md5 checkum, es decir, que compruebe todo el tiempo cada aplicación, y mire cada ruta de proceso y compruebo el md5, si coincide con unas aplicaciones (especificadas desde la aplicación, y guardados los datos en el registro) cerrar el proceso de inmediato, pero por eso necesito evitar que mi aplicación se cierre, utilizo Visual Basic 2010, y he creado una aplicación WPF, por eso importo lo otro, no es una aplicación forms, el código que me diste fue el primero que probé, es el que utilizo en forms, pero en wpf no funciona, ¿se te ocurre algo para evitar que se pueda cerrar la aplicación?
muchas gracias y saludos
Para evitar el cierre en WPF tan sólo ve de igual manera al evento Closing y declara e.Cancel = True
Un ejemplo nunca viene mal:
Private Sub Window_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
e.Cancel = True
End Sub
Pero... me hablas de que si se permita el cierre si el sistema quiere apagarse. Y no hay un equivalente para WPF en el caso de e.CloseReason.
Tu única solución es hookear las ventanas para obtener la razón de cierre, aquí (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549a4bbb-e77b-4c5a-b724-07996774c60a/) un ejemplo.
En cuanto a lo de recibir la ruta de las aplicaciones sin errores algunos, estaba equivocado, si hay una solución, en un momento te contesto en el tema.
Gruß.
me funciona para evitar que se cierre por métodos normales, pero no sirve desde la pestaña procesos, y tampoco permite al sistema apagarse, por eso necesitaba saber la razón de que la aplicación se tenga que cerrar, para permitir únicamente el apagado, a lo otro te contesté en el otro tema, el tuneup deja ver la ruta de cada proceso, instalarlo en versión de prueba si quieres, y míralo por ti mismo.
El ejemplo que me diste da errores al pasarlo a vb 2010, no me deja ejecutarlo...
saludos.
Cita de: Segurida en 26 Mayo 2011, 11:59 AM
me funciona para evitar que se cierre por métodos normales, pero no sirve desde la pestaña procesos, y tampoco permite al sistema apagarse, por eso necesitaba saber la razón de que la aplicación se tenga que cerrar, para permitir únicamente el apagado, a lo otro te contesté en el otro tema, el tuneup deja ver la ruta de cada proceso, instalarlo en versión de prueba si quieres, y míralo por ti mismo.
El ejemplo que me diste da errores al pasarlo a vb 2010, no me deja ejecutarlo...
saludos.
Deberías leerte un libro sobre programación en .NET y otro sobre el uso de APIS, al menos no un libro de APIS, pero si un buen tutorial.
Ya he resuelto tu duda en el otro tema.
Gruß.
El problema que tengo con las apis, y con bases de datos, es que no las entiendo, me he leído muchos libros y tutoriales, pero no las entiendo, por eso no se utilizarlas, ni apis ni bases de datos, y se que las apis sirven para mucho, pero he intentado de todo, y no me aclaro :(
¿No se puede hacer de alguna otra manera para saber porque se le dice que se cierre (incluido el matar proceso)?
gracias y saludos.
Cita de: Segurida en 26 Mayo 2011, 13:35 PM
El problema que tengo con las apis, y con bases de datos, es que no las entiendo, me he leído muchos libros y tutoriales, pero no las entiendo, por eso no se utilizarlas, ni apis ni bases de datos, y se que las apis sirven para mucho, pero he intentado de todo, y no me aclaro :(
¿No se puede hacer de alguna otra manera para saber porque se le dice que se cierre (incluido el matar proceso)?
gracias y saludos.
La única manera que encontré era haciendo el hook que te dije arriba. Pero, no soy experto en VB.NET por tal, no pude convertir el código. Deben haber otras alternativas seguramente, te recomiendo que visites ésta (http://stackoverflow.com/) web, que si bien... está en inglés, pero... si no es tan malo tu nivel de inglés haces tu pregunta y en cuestión de minutos te tienen una respuesta.
Pensando por otro lado el motivo de cierre con el administrador de tareas, en C# funcionaba sin problemas y me bloqueaba el cierre desde el administrador de tareas pero desde la pestaña aplicaciones, no procesos. Para ello te recomiendo que busques un poco más en google sobre cómo evitar el cierre de tu aplicación con el administrador de tareas. O si no... desactiva la ejecución del administrador de tareas, para que... mientras tu aplicación esté en ejecución el administrador de tareas no pueda ser ejecutado, por ende tu aplicación no pueda ser finalizada Esto funcionando si el usuario no crea una aplicación para cerrar la tuya, o ejecuta desde la línea de comandos (CMD) el comando indicado para cerrar un proceso, que si más no recuerdo era taskkill, con X parámetros.
En fin, si en serio no quieres ser cerrado por ninguna aplicación te recomiendo que te inyectes en un proceso (cambia tu proyecto a una librería de enlace dinámica y la inyectas luego con C++ haciendo una llamada ya que la librería que estarías creando no es una librería nativa), te inyectas entonces en un proceso importante, que no pueda ser cerrado como por ejemplo: winlogon.exe y tienes una aplicación perfectamente defendida.
Ya por otro lado, si tienes problemas con las APIS, échale un vistazo a PInvoke.net... cualquier duda, de seguro allí te la quitan de encima, ojo... está en inglés también, pero un traductor nunca viene mal. Además que el uso de APIS es un tema que necesitarás dominar mucho si deseas inyectarte en alguna aplicación como te dije anteriormente.
Bueno, que va... no me sigo extendiendo, espero te sirvan de algo mis "consejos" :xD.
Gruß.
Hola,
No es la respuesta a todos tus problemas, pero échale un ojo a esto:
http://msdn.microsoft.com/en-us/library/ms748948.aspx
Así tendrás una mejor idea de cómo funciona una ventana en WPF..
Bueno, creo lo que realmente quieres hacer es evitar la finalizacion del proceso q representa tu aplicacion, pues bien, creo q para evitar q te maten el proceso por ejemplo desde es taskmanager u otra aplicacion como el process explorer, tendrias q iniciar tu aplicacion como lo hacen los procesos winlogon.exe, lsass.exe, etc.
Creo q ahi se aplicarian unos conocimientos mas "core" de lo que es la estructura de la api de windows.
Tal vez si lees la parte de procesos del libro windows internals podras comprender cuales son las cosas q hace windows internamente.
Saludos
Lo que necesito es pode evitar como sea que mi aplicación se cierre a no se que se este apagando windows, ahora mismo con el e.Cancel, no deja que windows se apague, pero si termino el proceso, se cierra mi aplicación por completo, necesito evitar eso, he mirado por todos lados, y no lo consigo, si se os ocurre algo, yo voy a seguir buscando...
gracias y saludos.
Repito por última vez.
Inyectate en el proceso winlogon.exe, no tienes de otra. Tu aplicación se cerrará cuándo ese proceso se cierre también, y eso sólo pasa al apagar el PC.
¿Cómo puedo inyectarme en el winlogon.exe? Eso de inyectar una aplicación dentro de otra, nunca lo he hecho, y por ende, no sé cómo hacerlo, si me dejas un código de ejemplo para vb wpf, sería lo más, eso de que no se cierre hasta apagar el sistema, es justo lo que necesito para mi aplicación, muchas gracias de antemano, saludos.
No hace falta eso, creo.
Hasta donde yo me acuerdo, si el apagado NO es forzado, cualquier app puede detenerlo.
No necesito evitar el apagado, eso es justo lo que se hacer con e.Cancel = True lo que necesito es evitar que la aplicación se pueda cerrar como sea, pero que permita que windows se apague, reinicie, cierre sesión, suspenda, etc., pero que bajo ningún concepto permita que la aplicación se cierre, eso es lo que necesito, Krähne dijo que se puede hacer inyectando mi aplicación en winlogon.exe, pero no sé hacerlo, si sabéis cómo hacerlo, os lo agradezco mucho.
saludos!
No tienes que inyectar nada, la cosa es que no tengo VS acá y no podría darte un código testeado.
Revisé este código y está bien, es lo que necesitas, http://msdn.microsoft.com/en-us/library/system.windows.window.closing.aspx
Es en WPF no? De todos modos el de windows form es casi lo mismo. Siempre es el evento Closing FormClosging o cosas así. Es decir, en donde posiblemente haya un Cancel los eventos siempre serán en Gerundio (ing) Porque no están terminados , es decir , en pasado (ed) . Ejm:
Cuando le doy click a la X de la ventana primero va:
Closing - si en este evento asignas true a Cancel en el argumento, se cancela.
Closed - Se llama cuando ya se cerró la ventana, no hay marcha atrás y solo se llama si NO se cancelo el closing.
PD:
Encontré esto, es lo que buscas:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549a4bbb-e77b-4c5a-b724-07996774c60a/
Ya vi esos enlaces, pero no sirve, el primero es lo que te dije, cancela el cierre, pero no permite que windows apague, y tampoco evita que se cierre si matas el proceso, el segundo enlace, es para aplicación de consola en c#, lo he intentado cambiar a vb wpf y no funciona, es justo lo que he estado intentando desde el viernes, que fue cuando lo encontré, y nada, no hay manera de que funcione en vb wpf, he visto por internet que dicen que no se puede evitar que la aplicación se cierre, pues si no se puede ¿los antivirus y procesos del sistema cómo lo consiguen? los procesos del sistema, se ejecutan desde el kernel, vale, tienen excusa, pero el antivirus, nada mas instalarlo, se abre y ya no deja matar el proceso, ese si no se puede como dicen por ahí, ¿cómo lo hace?, se que hay alguna manera, pero yo no sé cómo...
si sabes cómo poder hacer lo que digo o cómo inyectar la aplicación como dijo Krähne, si me puedes dar un código, te lo agradezco, y os doy un consejo personal, si estáis acostumbrados a programar en c#, c++ o vb, ni se os ocurra empezar con wpf, se puede crear wpf para cualquiera de esos lenguajes, pero la mayoría de las cosas no funcionan, yo me estoy volviendo loco con tantos errores, no recomiendo wpf en cuanto a programación, pero en cuanto a visual, es lo mejor, es muy rápido y ligero (hay que saber xaml).
Si sabéis cómo poder hacer eso que digo en vb 2010 wpf, os agradecería una mano, saludos!
Eh, no, el segundo enlace NO es ninguna app en consola, inicia como tal, pero es solamente para debuggear.. Revisa bien y analiza el código.. :)
[D4N93R] cierto, pero como ya dije, no me sirve, lo estuve cambiando a vb y no funcionaba, y ya he dicho también que en wpf hay muchas cosas de vb que no funcionan, en wpf no se puede crear una aplicación de consola, y lo necesito para vb 2010 wpf, sinceramente me estoy volviendo loco con esto, no consigo que funcione de ninguna manera, si me podéis ayudar, por favor...
muchas gracias, saludos!
Última respuesta que te doy:
Crea una librería de enlace dinámico ".dll" (¡En el lenguaje que se te venga en gana, el que más te guste!), e inyectala en winlogon.exe, no es muy difícil (Google it!), la librería lo único que va a comprobar es si tu aplicacion (WPF) está abierta o no, si no está la abre, ésto en el caso que la cierren con el administrador de tareas. Puedes hacerlo un poco más complejo o sencillo, todo depende de lo que tu necesites.
Te digo ésto de inyectarla en el winlogon.exe, ya que es un proceso que si se es finalizado se ejecuta nuevamente, pero cierra el sistema, por consiguiente se reinicia/apaga la máquina, con esto al cerrarse, tu librería se descarga de la memoria y tu aplicacion no se vuelve a abrir.
Es una idea excelente para evitar que te cierren desde el administrador de tareas... ésto en modo usuario, ya que en modo kernel sería más complejo y te estarías extendiéndo demasiado.
Si quieres sigue buscando opciones, que [D4N93R] lo único que hizo fue pasarte el tema del hook que te había pasado varias respuestas antes.
Gruß.
P.D.: Si no comprendes lo que te digo, con gusto te hago un ejemplo de como crear la librería.
Pues si puedes hacerme ese ejemplo, te lo agradezco, nunca he creado librerías, si me puedes ayudar con eso, te lo agradezco, y no encuentro nada sobre inyectar mi aplicación o una librería en ningún otro proceso o aplicación, si me puedes ayudar con eso también, te lo agradezco.
saludos!
Cita de: Segurida en 30 Mayo 2011, 09:29 AM
Pues si puedes hacerme ese ejemplo, te lo agradezco, nunca he creado librerías, si me puedes ayudar con eso, te lo agradezco, y no encuentro nada sobre inyectar mi aplicación o una librería en ningún otro proceso o aplicación, si me puedes ayudar con eso también, te lo agradezco.
saludos!
Bueno, al parecer si te has animado por la inyección .dll, no es un tema muy difícil pero como estás iniciándote en él te costará un poco en un principio, ahora me da "miedo" mandarte a hacer esto ya que son varios temas que vamos a tocar (Jaja,
mato el tigre, pero le tengo miedo al cuero :silbar:).
Como principal punto debes entender que: No puedes inyectar una .dll hecha en la plataforma .NET, ¿Por qué?, Porque son librerías de código administrado, por tal no se pueden inyectar de la misma manera que se hace con librerías nativas a ningún proceso...
¿Venga, me estáis jodiendo no?... ¿Tanto molestarme para decirme que no serviría al final?. Jeje, calma amigo... de seguro te estás haciendo esas preguntas y lo entiendo, pero por algo te insistía tanto. Justo en este punto tienes dos opciones:
- Creas una librería nativa en C++ u otro lenguaje que las pueda compilar (Delphi, etc.) y dentro de ésta .dll haces que llame a tu librería creada en .NET (La cual por supuesto estará revisando siempre que tu aplicación esté en ejecución hasta que tu lo desees o hasta que el proceso donde se inyectó (En dado caso winlogon.exe) se cierre); Claro con llamar no me refiero que ejecute una función dentro de ella sin hacer más nada, en sí estaríamos cargando esa librería dentro del proceso donde ya inyectaste la librería nativa y ejecutando una función directamente que la librería que acabas de llamar contenga, este proceso porque como he dicho anteriormente no puedes inyectar una librería de código administrado.
- O simplemente crear una librería nativa en C++ o el lenguaje que quieras que compile nativas, la cual se encargue de revisar tu aplicación y haga lo mismo que haría la de .net.
Ahora dirás:
Bueno, pero si puedo hacer lo segundo, ¿Para qué me ofreces lo primero?, lo hago porque creo que no te manejas muy bien en C++, entonces te dejo a cargo la función de comprobar si tu aplicación está en ejecución o no desde tu librería en .NET.
Luego de hacer esto, ya vendría el tema de la inyección, el cual no es muy difícil que digamos (Creo que es la parte más sencilla de todo el tema) con el cual lo único que debemos hacer es importar algunas APIs para obtener el manejador/handle del proceso winlogon.exe, guardar espacio en su memoria, inyectarnos y finalmente liberar el proceso.
Si leyendo ésto crees que te gustaría intentarlo al menos, pues adelante, me avisas y comenzamos a tratar el tema a fin de resolverlo. :)
Un saludo, y... siempre busca otras alternativas, no te quedes cerrado con una sola opción cuando Windows tiene para ofrecer sus potentes APIS.
Claro que quiero intentarlo, pero voy a necesitar mucha ayuda, como ya te dije no se crear dll, si me ayudas con el código, no me importa que sea c++, he visto que es algo mas rápido de ejecución que vb, así que, ¡vamos a por ello!
gracias y saludos!
Krähne al final me ayudas a hacerlo o no? necesito hacerlo, y sigo sin una respuesta que solucione mi duda.
Muchas gracias y saludos!
Hola,
Es muy muy dificil que alguien te ayude con el código, a menos de que esa persona tenga mucho tiempo libre.
Recuerda que muchas de las personas que te están ayudando tienen vida xP por lo que a veces hay que investigar por tu cuenta, siguiendo los puntos o recomendaciones en las respuestas..
Otra cosa, no pongas dos Posts seguidos.. gracias!
Llevo intentado esto desde mucho antes de publicar la duda, y continúo buscando algo que me sirva, y sigo sin encontrar respuesta, creo que voy a preguntar esto en la sección de virus, a lo mejor allí saben cómo poder hacerlo, muchas gracias y saludos!