e.CloseReason en Visual Basic 2010 WPF

Iniciado por Segurida, 25 Mayo 2011, 11:08 AM

0 Miembros y 1 Visitante están viendo este tema.

Segurida

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:
Código (vbnet) [Seleccionar]
Imports System.Windows.Forms.CloseReason pero no hace nada, cuando la cierras, se cierra del todo, no lo cancela...
gracias y saludos.

Krähne

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.

Código (vbnet) [Seleccionar]
    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ß.
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.

Segurida

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

Krähne

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:

Código (vbnet) [Seleccionar]
    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í 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ß.
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.

Segurida

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.

Krähne

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ß.
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.

Segurida

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.

Krähne

#7
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 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ß.
Yo soy más sabio que este hombre; es posible que ninguno de los dos sepamos cosa que valga la pena, pero él cree que sabe algo, pese a no saberlo, mientras que yo, así como no sé nada, tampoco creo saberlo. Yo no tengo conciencia de saber nada.

[D4N93R]

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..

neoncyber

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
Código (python) [Seleccionar]

#!/usr/bin/python
print "Visit:"
print "http:\\donkeysharp.blogspot.com"