none
Codigo para apagar la pc WPF RRS feed

  • Pregunta

  • buenas gente, necesito ayuda en una aplicacion WPF q desarrollo

    yo uso el siquiente codigo de VB para apagar la pcen Winforms

    	Private Sub btn1Minute_Click(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
    		if btnShutdown.IsChecked = true then
    		CountDownTime = DateTime.Now.AddMinutes(span)
        Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
        QuickShutdownTimer.Start()
        Shell("shutdown /s /t 60")
        lblTitle.Content = "MyApp - Shutdown Task in Progress"
        btnShutdown.IsEnabled = False
        btnRestart.IsEnabled = False
        btnHibernate.IsEnabled = False
        btnLogOff.IsEnabled = False
        btnStatus.Content = "Cancel Task"
    		end if
    	End Sub
    pero lo estoy pasando a WPF entonces necesito ayuda en la siguiente linea
    Shell("shutdown /s /t 60")
    

     

    domingo, 6 de junio de 2010 0:11

Respuestas

  • Hola luis.

    a partir de .net 3.0 ha cambiado el objeto shell. Aunque se han implementado mas funciones, es algo diferente, ya que por ejemplo el 'System.Windows.Shell' es un namespace efectivamente, que incluye funciones para manejo de la nueva barra de tareas de windows 7 (algo que no existia en .net 2.0).

    Bueno, al grano. Yo siempre hago uso de la consola del sistema directamente para ejecutar comandos de la shell de windows, asi que puedes hacer uso de un codigo como este para realizarlo:

     

       // para modificar propiedades del proceso a abrir
       System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("CMD.exe");
       // redirigir la entrada estandard de la consola
       psi.RedirectStandardInput = true;
       psi.RedirectStandardOutput = true;
       // visibilidad del proceso
       psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
       // no utilizar la shell del sistema para iniciar el proceso(necesario para redirigir la entrada estandard)
       psi.UseShellExecute = false;
    
       // variable para manejar el proceso a abrir
       System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);
       // obtener la entrada estandard para poder enviar comandos a la consola
       System.IO.StreamWriter myOutput = proc.StandardInput;   
    
       // comenzar a insertar comandos
       myOutput.WriteLine("@ECHO OFF ");
       myOutput.WriteLine("TITLE \"Apagar PC\" "); 

     

    Este es un codio parecido al que puse una vez en el foro de c#, pero adaptado para apagar el pc.

    Ademas este codigo te va a servir para cualquier version de .net ya que realmente trabajas con el proceso cmd directamente.

    Bueno, si no entiendes algo comentamelo.

     


    Saludos
    David González
    lunes, 7 de junio de 2010 6:51

Todas las respuestas

  • Hola Luis

    Acabo de probar la línea que indicas:

    Shell("shutdown /s /t 60")
    
    

    Y funciona perfectamente, avisa de que se va a apagar el pc en 1 minuto y pasado un minuto lo apaga.

    ¿Que necesitas en concreto?

    Un gran saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog
    Sigueme en Twitter
    domingo, 6 de junio de 2010 9:57
    Moderador
  • Gracias Josue por tu respuesta el problema que tengo  es que me sale el siguiente error: "System.Windows.Shell is a namespace and cannot be used as an expression"

    soy nuevo en WPF entonces por eso ocupo ayuda.

    Estoy usando Visual Studio 2010 y Expression Blend 4 RC

    lunes, 7 de junio de 2010 2:41
  • Hola luis.

    a partir de .net 3.0 ha cambiado el objeto shell. Aunque se han implementado mas funciones, es algo diferente, ya que por ejemplo el 'System.Windows.Shell' es un namespace efectivamente, que incluye funciones para manejo de la nueva barra de tareas de windows 7 (algo que no existia en .net 2.0).

    Bueno, al grano. Yo siempre hago uso de la consola del sistema directamente para ejecutar comandos de la shell de windows, asi que puedes hacer uso de un codigo como este para realizarlo:

     

       // para modificar propiedades del proceso a abrir
       System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("CMD.exe");
       // redirigir la entrada estandard de la consola
       psi.RedirectStandardInput = true;
       psi.RedirectStandardOutput = true;
       // visibilidad del proceso
       psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
       // no utilizar la shell del sistema para iniciar el proceso(necesario para redirigir la entrada estandard)
       psi.UseShellExecute = false;
    
       // variable para manejar el proceso a abrir
       System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);
       // obtener la entrada estandard para poder enviar comandos a la consola
       System.IO.StreamWriter myOutput = proc.StandardInput;   
    
       // comenzar a insertar comandos
       myOutput.WriteLine("@ECHO OFF ");
       myOutput.WriteLine("TITLE \"Apagar PC\" "); 

     

    Este es un codio parecido al que puse una vez en el foro de c#, pero adaptado para apagar el pc.

    Ademas este codigo te va a servir para cualquier version de .net ya que realmente trabajas con el proceso cmd directamente.

    Bueno, si no entiendes algo comentamelo.

     


    Saludos
    David González
    lunes, 7 de junio de 2010 6:51
  • gracias por tu ayuda David. Voy a probar eso.
    martes, 8 de junio de 2010 1:32
  • el problema anterior ya lo pude resolver. reescribi el mismo codigo q utilice para las demas opciones del programa y lo adapte para esto.

    ahora la duda que tengo es en este fragmento de codigo:

    Private Sub btnQuickOK_Click(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
    If btnShutdown.IsChecked = True Then
    If (cbTime.SelectedIndex = 0) Then
    CountDownTime = DateTime.Now.AddMinutes(t5)
    Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
    QuickShutdownTimer.Start()
    lblTitle.Content = "iSun Shut 3 - Shutdown Task in Progress"
    DisableButtons()
    ElseIf (cbTime.Text = "10 min") Then
    CountDownTime = DateTime.Now.AddMinutes(t10)
    Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
    QuickShutdownTimer.Start()
    lblTitle.Content = "iSun Shut 3 - Shutdown Task in Progress"
    DisableButtons()
    ElseIf (cbTime.Text = "30 min") Then
    CountDownTime = DateTime.Now.AddMinutes(t30)
    Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
    QuickShutdownTimer.Start()
    lblTitle.Content = "iSun Shut 3 - Shutdown Task in Progress"
    DisableButtons()
    ElseIf (cbTime.Text = "1 hour") Then
    CountDownTime = DateTime.Now.AddMinutes(t60)
    Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
    QuickShutdownTimer.Start()
    lblTitle.Content = "iSun Shut 3 - Shutdown Task in Progress"
    DisableButtons()
    End If
    End If
    End Sub

    el problema es q al darle click al botton no sucede nd....en el primer frsgmento "If" utilice "cbTime.SelectedIndex = 0" y en los demas "cbTime.Text = ("# min")" esto cmo motivo de prueba...pero igualmente me sigue sin funcionar...es cmo si estuviera dandole click a un boton vacio

    les agradesco su ayuda de antemano

    por cierto el codigo "hermano" de esto es:

    Private Sub QuickCustomShutdownTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
        If (CountDownTime < DateTime.Now) Then
          If btnShutdown.IsChecked = True Then
            QuickCustomShutdownTimer.Stop()
            WindowsController.ExitWindows(RestartOptions.ShutDown, True)
          ElseIf btnRestart.IsChecked = True Then
            QuickCustomShutdownTimer.Stop()
            WindowsController.ExitWindows(RestartOptions.Reboot, True)
          ElseIf btnHibernate.IsChecked = True Then
            QuickCustomShutdownTimer.Stop()
            WindowsController.ExitWindows(RestartOptions.Hibernate, True)
          ElseIf btnLogOff.IsChecked = True Then
            QuickCustomShutdownTimer.Stop()
            WindowsController.ExitWindows(RestartOptions.LogOff, True)
          End If
        Else
          Dim ts As TimeSpan = CountDownTime.Subtract(DateTime.Now)
          statusBar.Header = ("Time Remaining: " _
                + (ts.Minutes.ToString + " Minutes " + ts.Seconds.ToString) + " Seconds")
        End If
      End Sub

    ese si parece funcionar ya q fue la solucion q use con el primer problema q plantee dias atras

    gracias, y disculpen si esta complicado de entender Jeje

    martes, 8 de junio de 2010 4:33
  • Hola Luis.

    ¿entonces, te funciona o no?, si es que no, ¿has depurado a ver si entra en las funciones correctamente?


    Saludos
    David González
    martes, 8 de junio de 2010 13:33
  • ya lo pude arreglar gracias
    martes, 8 de junio de 2010 23:38