Announcement

Collapse
No announcement yet.

PC automatisch aufwecken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PC automatisch aufwecken

    Hallo an alle

    Ich habe ein großes Problem ! ?
    Ich möchte meinen PC (Windows XP) mit einem VB Programm aus dem Ruhezustand wecken.
    Es besteht nicht die Möglichkeit für WOL, Bios Wecker, oder dem Taskplaner, da das Programm vollautomatisch laufen soll
    und zudem sich die Zeiten des Hochfahrens ändern können.
    In den Ruhezustand versetze ich den Rechner mit:
    'Application.SetSuspendState(PowerState.Hibernate, False, False)

    Aber das Aufwecken will einfach nicht ;(

    Ich habe es mit der Seite http://support.microsoft.com/kb/q231298/ versucht aber die Funktion
    CreateWaitableTimer() gibt immer den Fehler aus:
    "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

    Ich habe aber leider keine Ahnung was ich dagegen tun kann...

    Ich habe es auch schon mit dem Taskplaner versucht, mit folgenden Code:
    ...
    Shell("C:\WINDOWS\system32\cmd.exe /C at " & myStartTime & ":00 /interactive update.exe", AppWinStyle.Hide, True, -1)
    Shell("C:\WINDOWS\system32\cmd.exe /C waketask 1 At1", AppWinStyle.Hide, True, -1)
    ...

    Zu Erklärung: Ich rufe damit die Eingabeaufforderung auf und übergebe dem standard Taskplaner "at.exe" meine Variablen (myStartTime)
    danach nochmal das selbe nur diesmal mit waketask.exe der in dem soeben erstellten Task die Flag "Rechner zum Ausführen des Task reaktivieren" setzt.

    Das ganze klappt auch wunderbar aber leider und das auch zu meiner Verwunderung nicht über Nacht, d.h.
    Mein Progi fährt den Rechner um 15:00 Uhr in den Ruhezustand und stellt vorher den Task ein für den nächsten Tag um 7:00 Uhr aber am
    nächsten Morgen passiert nichts
    ABER wenn ich mein Programm so umstelle das es den Rechner um 15:00 Uhr runterfährt und den Task auf 15:15 einstellt funktioniert es und der Rechner fährt hoch :cursing: 8|

    Wer es mal mit der Waketask.exe ausprobieren will: http://www.huebert.info/waketask/
    (Und keine Sorge das ist alles Viren frei )

    Auch für andere Vorschläge bin ich offen

    Bitte, bitte helft mir

    An alle schon mal dank im voraus

    Hubertus23 :thumbup:

  • #2
    versuch mal folgendes:
    (mit bisschen gutem Willen, kann man das ganze auf VB überlegen)
    [highlight=c#]
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Threading;
    namespace YourNamespace
    {
    class Program
    {
    [DllImport("kernel32.dll")]
    public static extern IntPtr CreateWaitableTimer(IntPtr
    lpTimerAttributes,
    bool bManualReset, string lpTimerName);

    [DllImport("kernel32.dll")]
    public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long
    pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr
    lpArgToCompletionRoutine, bool fResume);

    [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
    public static extern Int32 WaitForSingleObject(IntPtr handle, uint
    milliseconds);

    static void Main()
    {
    SetWaitForWakeUpTime();
    }

    static IntPtr handle;
    static void SetWaitForWakeUpTime()
    {
    long duetime = -300000000; // negative value, so a RELATIVE
    due time
    handle = CreateWaitableTimer(IntPtr.Zero, true,
    SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero,
    IntPtr.Zero, true);
    long duetime = -300000000;
    Console.WriteLine("{0:x}",duetime);
    handle = CreateWaitableTimer(IntPtr.Zero, true,
    SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero,
    IntPtr.Zero, true);
    uint INFINITE = 0xFFFFFFFF;
    int ret = WaitForSingleObject(handle, INFINITE);
    MessageBox.Show("Wake up call");
    }

    }
    [/Code]
    oder
    [Code]
    class Program
    {
    [DllImport("kernel32.dll")]
    public static extern SafeWaitHandle CreateWaitableTimer(IntPtr
    lpTimerAttributes,
    bool bManualReset, string lpTimerName);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In]
    ref long
    pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr
    lpArgToCompletionRoutine, bool fResume);

    ...

    static void SetWaitForWakeUpTime()
    {
    DateTime utc = new DateTime(2008, 3, 16, 22, 53, 00,
    DateTimeKind.Utc);
    long duetime = utc.ToFileTime();
    using(SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero,
    true, "MyWaitabletimer"))
    {
    if(SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero,
    IntPtr.Zero, true))
    {
    using(EventWaitHandle wh = new EventWaitHandle(false,
    EventResetMode.AutoReset))
    {
    wh.SafeWaitHandle = handle;
    wh.WaitOne();
    }
    }
    else
    {
    throw new Win32Exception(Marshal.GetLastWin32Error());
    }
    }
    MessageBox.Show("Wake up call")
    }
    [/highlight]
    Zuletzt editiert von vadym voytas; 01.10.2009, 22:17.
    Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

    Comment


    • #3
      Auch hier gilt: nicht "Zitat", sondern "Code" oder "highlight"!

      Außerdem musst du bedenken, dass die Frage auf VB zielte. Eine NET-Antwort in C# ist zwar dennoch richtig, benötigt aber zumindest einen kleinen Hinweis.

      Jürgen

      Comment

      Working...
      X