[VisualBasic] PC zu bestimmter Zeit herunterfahren

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von skittles, 12. Januar 2007 .

  1. 12. Januar 2007
    PC zu bestimmter Zeit herunterfahren

    Hi RR'ler,

    hab da mal ne Frage: Ich möchte ein Programm schreiben, das den PC zu einer bestimmten Zeit herunterfährt. Hab ich soweit auch geschafft, nur funktioniert das nur, wenn das Programm offen bleibt. Er soll den PC aber auch herunterfahren, wenn das Programm geschlossen ist.

    Gibt es da eine Möglichkeit?

    Ich hatte die Idee, es vielleicht durch einen geplanten Task bei Windows XP zu machen, allerdings weiß ich nicht, wie man so einen mit Visual Basic oder einem CMD-Befehl anlegt.

    Oder habt ihr ne bessere Idee?

    Bin für jede Antwort dankbar und bewerte jeden der versucht mir zu helfen

    greetz skittles
     
  2. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    hm wieso willst du das programm nicht laufen haben? es kann doch einfach die ganze zeit im hintergrund laufen...
    Mit dem Task das ist ja noch umständlicher als das Programm einfach laufen zu lassen ^^

    Gruß,
    Figger
     
  3. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    mir macht das nichts aus ^^ aber eventuell den leuten die das Programm dann benutzen.
    wär halt einfacher, wenn man das Programm ausversehen schliesst oder nicht so viel im Hintergrund geöffnet haben will
     
  4. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    ich hab nicht sehr viel ahnung mach doch aber das das programm links unten hin kommt kp jetzt wie das heißt also so wie bei shareaza oder msn oder windows firewall u.s.w
     
  5. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    du meintest rechts oder?

    stimmt, das wäre auch eine Möglichkeit (es heisst übrigens Tray)

    aber ich weiß auch nicht, wie das funktioniert
     
  6. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    http://www.vbarchiv.net/archiv/tipp_details.php?pid=517
    Dann noch ein Kontextmenu auf das Trayicon und fertig

    Gruß,
    Figger
     
  7. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Öhm, mit dem Tray komm ich irgendwie nicht klar
     
  8. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    das ist doch nicht schwer
    du haust diesen code in ein modul rein:
    Code:
    Option Explicit
    
    ' alle benötigten API-Deklarationen
    Public Declare Sub keybd_event Lib "user32" _
     (ByVal bVk As Byte, ByVal bScan As Byte, _
     ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const VK_LWIN = &H5B
    
    Public Type NOTIFYICONDATA
     cbSize As Long
     hWnd As Long
     uId As Long
     uFlags As Long
     uCallBackMessage As Long
     hIcon As Long
     szTip As String * 64
    End Type
    
    Public Const NIM_ADD = &H0
    Public Const NIM_MODIFY = &H1
    Public Const NIM_DELETE = &H2
    
    Public Const NIF_MESSAGE = &H1
    Public Const NIF_ICON = &H2
    Public Const NIF_TIP = &H4
    
    Public Const WM_MOUSEMOVE = &H200
    
    ' Konstanten für linke Maustaste
    Public Const WM_LBUTTONDBLCLK = &H203 ' Doppelklick
    Public Const WM_LBUTTONDOWN = &H201 ' Maus gedrückt
    Public Const WM_LBUTTONUP = &H202 ' Maus losgelassen
    
    ' Konstanten für rechte Maustaste
    Public Const WM_RBUTTONDBLCLK = &H206 ' Doppelklick
    Public Const WM_RBUTTONDOWN = &H204 ' Maus gedrückt
    Public Const WM_RBUTTONUP = &H205 ' Maus losgelassen
    
    Public Declare Function Shell_NotifyIcon Lib _
     "shell32" Alias "Shell_NotifyIconA" ( _
     ByVal dwMessage As Long, _
     pnid As NOTIFYICONDATA) As Boolean
    
    Public nid As NOTIFYICONDATA
    in Form_load das hier:
    Code:
    With nid
     .cbSize = Len(nid)
     .hWnd = Me.hWnd
     .uId = vbNull
     .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
     .uCallBackMessage = WM_MOUSEMOVE
     .hIcon = Me.Icon
     .szTip = Me.Caption & vbNullChar
     End With
     Shell_NotifyIcon NIM_ADD, nid
    in Form_MouseMove das hier:
    Code:
     ' Das MouseMove Ereignis wird ausgelöst, wenn die
     ' Maus über das Symbol im Systray geführt wird
    
     Dim lMsg As Long
     Dim sFilter As String
     
     lMsg = X / Screen.TwipsPerPixelX
     Select Case lMsg
     Case WM_LBUTTONDOWN
     ' linke Maustaste wird gedrückt
     
     Case WM_LBUTTONUP
     ' linke Maustaste wird losgelassen
     
     Case WM_LBUTTONDBLCLK
     ' linke Maustaste - Doppelklick
     
     Case WM_RBUTTONDOWN
     ' rechte Maustaste wird gedrückt
     
     Case WM_RBUTTONUP
     ' rechte Maustaste wird losgelassen
     ' (jetzt z.B. Popup-Menü öffnen)
     PopupMenu MenuPopUp
     
     Case WM_RBUTTONDBLCLK
     ' rechte Maustaste - Doppeklick
     
     End Select
    in form_unload das:
    Code:
     ' Symbol aus dem Systray entfernen,
     ' wenn das Programm beended wird
     Shell_NotifyIcon NIM_DELETE, nid
    Dann machst du noch ein normales popupmenu und nennst es MenuPopUp, wo du dann halt sachen wie "Programm anzeigen" und "Beenden" und was du halt alles brauchst reinmachst...
    Das behandelst du wie ein normales popupmenu...

    Achja und im Systray wird dann das icon angezeigt dass du deiner form zugewwiesen hast.

    Gruß,
    Figger
     
  9. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Öhm, also ein PopUpMenu gibt es bei mir irgendwie nicht und der restliche Code bringt ne ganze Menge Fehlermeldungen. (die meisten "Deklaration erwartet")

    kanns sein, dass wir von verschiedenen Visual Basic Versionen reden?

    Also ich hab Visual Basic 2005 Express Edition. Vielleicht ist dein Code ja nur für Visual Basic 6 oder so?

    skittles

    //EDIT: Das Ereignis Form_Unload gibt es übrigens auch nicht
     
  10. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Der code der oben steht ist auch für vb 6

    btw so bekommst in vb6 nen menü für dein popupmenü hin:

    Bild=down!

    Knusperkeks
     
  11. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Jo dat is VB6 Code, hier was dazu für vb2005, laut dem Thread scheint es zu funktionieren
    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=112510&SiteID=1
    Der Code ganz unten!

    Gruß,
    Figger
     
  12. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Ich komm damit irgendwie nicht zurecht... da kommt irgend ne Fehlermeldung mit Form1 oder so, aber ich hab Form1 gelöscht...
     
  13. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    mmmhhh... hört sich an als wenn das der Fehler wär, bei dem die Startfunktion nicht gefunden wird, ein Doppelklick auf den Fehler würd helfen.

    Wie heisst der Fehler genau ?

    Poste doch mal Deinen Quelltext, dann bau ich Dir das mit dem NotifyIcon (so schwer ist das net).

    Übrigens mit System.Windows.Forms.Form.Hide kannst Du das Programm so verstecken, dass es nicht erscheint wenn man Alt+Tab drückt.

    BG MaxDev
     
  14. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Also ich poste mal die einzelnen Schritte:



    1: Ich starte meine Visual Basic 2005 Express Edition ^^

    2: Ich erstelle ein Neues Projekt -> Windows Anwendung

    3: Ich lösche Form1.vb

    4: Ich gehe auf Projekt -> Element hinzufügen -> Modul

    5: Ich kopiere diesen Text in das Code-Fenster vom Modul:
    Code:
    Imports system.Windows.Forms
    
    Module modMain
     Private WithEvents SysTray As NotifyIcon
     Private WithEvents SysTrayMenu As ContextMenuStrip
     Private handlerSysTrayMenuItemClicked As New ToolStripItemClickedEventHandler(AddressOf SysTrayMenu_Click)
    
     Const mnuAbout = "&About..."
     Const mnuExit = "E&xit"
    
     Sub Main()
    
     SysTray = New NotifyIcon
    
     SysTrayMenu = New ContextMenuStrip()
     With SysTrayMenu
     .Items.Add(mnuAbout)
     .Items.Add(mnuExit)
     End With
    
     With SysTray
     .Text = "System Tray Icon"
     .ContextMenuStrip = SysTrayMenu
     .Icon = New Icon("C:\Program Files\Common Files\Microsoft Shared\MSDN\msdn.ico")
     .Visible = True
     End With
    
     Application.Run()
    
     End Sub
    
     Sub SysTrayMenu_Click(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs) Handles SysTrayMenu.ItemClicked
     Select Case e.ClickedItem.Text
     Case mnuExit
     SysTray.Visible = False
     Application.ExitThread()
    
     Case mnuAbout
     MsgBox("About was selected")
     End Select
     End Sub
    End Module
    6: Fehlermeldung: Form1 ist kein Member von "Windows Application 1" in Application.Designer.vb(was das auch für ne Datei ist) [Zeile 35 | Spalte 27]



    //EDIT: Doppelklick auf die Fehlermeldung und es öffnet sich die Datei Application.Designer.vb
    Code:
    Code:
    '------------------------------------------------------------------------------
    ' <auto-generated>
    ' This code was generated by a tool.
    ' Runtime Version:2.0.50727.42
    '
    ' Changes to this file may cause incorrect behavior and will be lost if
    ' the code is regenerated.
    ' </auto-generated>
    '------------------------------------------------------------------------------
    
    Option Strict On
    Option Explicit On
    
    
    Namespace My
     
     'NOTE: This file is auto-generated; do not modify it directly. To make changes,
     ' or if you encounter build errors in this file, go to the Project Designer
     ' (go to Project Properties or double-click the My Project node in
     ' Solution Explorer), and make changes on the Application tab.
     '
     Partial Friend Class MyApplication
     
     <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
     Public Sub New()
     MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
     Me.IsSingleInstance = false
     Me.EnableVisualStyles = true
     Me.SaveMySettingsOnExit = true
     Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
     End Sub
     
     <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
     Protected Overrides Sub OnCreateMainForm()
     [COLOR="Red"]Me.MainForm = Global.WindowsApplication1.Form1 'Hier ist die Fehlermeldung[/COLOR]
     End Sub
     End Class
    End Namespace
    
     
  15. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Naja klar das der die nicht findet, schließlich hast Du das Form ja auch rausgelöscht.

    Windowsapplikationen haben immer eine Startform. Es muss also mindestens eine Form in dem Projekt vorhanden sein. Diese muss in den Projekteigenschaften eingtragen sein, damit der VB Compiler weiss wo er anfangen soll. Wenn die exe generiert wurde wird dann auch das Form beim Ausführen der exe als erstes geladen.

    Also ich bin mir net ganz sicher was Du vor hast für ne Applikation zu bauen, aber wenn Du ein normales Windows Programm schreiben willst kommst Du um die Startform (oder auch MainForm) nicht drum herum.

    Du kannst auch ein eigenes Form als Startform nehmen oder Form1 umschreiben. Aber hier muss es dann drin stehen
    Code:
    Protected Overrides Sub OnCreateMainForm()
     Me.MainForm = Global.WindowsApplication1.MyFormName ' <= Dein Form
     End Sub
    Und Dein Form muss etwa so aussehen

    Code:
    Public Class MyForm
     Inherits System.Windows.Forms.Form
    
    #Region " Windows Form Designer generated code "
    
     Public Sub New()
     MyBase.New()
    
     'This call is required by the Windows Form Designer.
     InitializeComponent()
    
     'Add any initialization after the InitializeComponent() call
    
     End Sub
    
     'Form overrides dispose to clean up the component list.
     Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
     If disposing Then
     If Not (components Is Nothing) Then
     components.Dispose()
     End If
     End If
     MyBase.Dispose(disposing)
     End Sub
    
     'Required by the Windows Form Designer
     Private components As System.ComponentModel.IContainer
    
     'NOTE: The following procedure is required by the Windows Form Designer
     'It can be modified using the Windows Form Designer. 
     'Do not modify it using the code editor.
     <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
     '
     'Form1
     '
     Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
     Me.ClientSize = New System.Drawing.Size(292, 273)
     Me.Name = "MyForm"
     Me.Text = "MyForm"
    
     End Sub
    
    #End Region
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
     End Sub
    End Class
    
    BG MaxDev
     
  16. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Hmmmm ich versteh das nicht, kannst du mir vielleicht die einzelnen Schritte sagen, dass ich ein Tray_Icon bekomme und trotzdem noch eine normale Windows-Anwendung habe?

    Wär echt nett...

    P.S.: Hab euch mal alle bewertet

    greetz skittles
     
  17. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Hier ein Beispiel: Download offline!/

    Ich nutze das NotifyIcon Control, kann man einfach aus der Toolbox in das Form ziehen.

    //Edit: Ich benutze Visual Studio 2003, Du solltest das Projekt aber problemlos konvertieren können (automatisch beim Öffnen).

    BG MaxDev

    PS: Such nach "VB.Net Create NotifyIcon" in den Google Groups für weitere Infos.
     
  18. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Jetzt ist das Programm sobald ich es aufrufe im Tray und ich kann MyForm nie anzeigen lassen
     
  19. 12. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Na klar...
    Code:
    Private Sub myIcon_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles myIcon.DoubleClick
     Me.Visible = True
     End Sub
    BG MaxDev
     
  20. 13. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    hmm so wie es aussieht, hast du ja auch nix dagegen, das mit der cmd in den taskplaner zu schreiben... da du ja noch den Befehl suchtest, dachte ich mir isch helf dir mal =))
    Code:
    C:\Dokumente und Einstellungen\thecoolman4rr>at /?
    Mit dem Befehl AT können Befehle und Programme zu einem vorbestimmten
    Termin gestartet werden. Der Zeitplandienst muss gestartet sein, um den
    Befehl AT zu verwenden.
    
    AT [\\Computername] [ [Kennung] [/DELETE] | /DELETE [/YES]]
    AT [\\Computername] Zeit [/INTERACTIVE]
     [ /EVERY:Datum[,...] | /NEXT:Datum[,...]] "Befehl"
    
    \\Computername Gibt einen Remotecomputer an. Ohne diesen Parameter werden
     die Befehle auf dem lokalen Computer ausgeführt.
    Kennung Eine Identifikationsnummer, die dem geplanten Befehl
     zugeteilt wird.
    /DELETE Löscht geplante Befehle. Ohne Kennung werden alle geplanten
     Befehle auf dem Computer gelöscht.
    /YES In Verbindung mit /DELETE werden die geplanten
     Befehle ohne weitere Bestätigung gelöscht.
    Zeit Gibt die Zeit an, zu der ein Befehl ausgeführt werden soll.
    /INTERACTIVE Ermöglicht dem Auftrag, Eingaben von dem Benutzer anzu-
     nehmen, der angemeldet ist, wenn der Auftrag ausgeführt
     wird.
    /EVERY:Datum[,...] Führt den Befehl zu jedem der angegebenen Tage der Woche
     oder des Monats aus. Ohne Angabe eines Datums wird der
     aktuelle Tag des Monats angenommen.
    /NEXT:Datum[,...] Führt den Befehl am nächsten angegebenen Tag aus (z.B.
     nächsten Montag). Ohne Angabe eines Datums wird der aktuelle
     Tag des Monats angenommen.
    "Befehl" Ist der auszuführende Windows NT-Befehl oder Stapel-
     programm.
    
    ist zwar keine VB-Lösung aber du hattest ja (zu mindest am Anfang) auch nix gegen den Zeitplandienst...

    mfg thecoolman4rr
     
  21. 13. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    danke thecoolman4rr,

    das werde ich dann auch mal probieren.

    aber nochmal zu dem Tray. Also ich habs jetzt hinbekommen. Allerdings funktioniert mein Programm nicht mehr wie ich will, wenn das Programm im Tray ist und dann die Zeit ist zu der er runterfahren passiert nichts mehr. Anscheinend läuft das Programm im Tray nicht mehr richtig oder der Timer, den ich benutzt habe um festzustellen ob die aktuelle Uhrzeit = der eingebenen Uhrzeit ist läuft nicht mehr weiter denk ich.

    Kann man da was machen, dass das Programm normal weiterläuft?

    skittles
     
  22. 13. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    Normalerweise sollte es auch weiterlaufen, mit welchem Befehl versteckst du die Form denn?

    Gruß,
    Figger
     
  23. 13. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    ich benutze Me.Hide()
     
  24. 13. Januar 2007
    AW: PC zu bestimmter Zeit herunterfahren

    hm keine Ahnung da kann ich dir auch nicht weiterhelfen kenne mich mit VB2005 auch gar nicht aus sorry.

    Gruß,
    Figger
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.