Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
14th
Фев
WaitableTimer, вывод компьютера из спящего режима
Posted by obzor under си шарп
Мне посоветовали WaitableTimer для вывода компьютера из сна.
Сегодня дотянулись руки, решил глянуть, и реализовать. Полез в интернет за информацией. Нашёл два исходника для шарпа. Проверил каждый как в источнике — компьютер из сна не выходит.
Как я понимаю, гвоздь сегодняшней программы — последний параметр функции SetWaiableTimer — должен быть true, как я правильно понял ?
На основе этих двух исходников соорудил свой под собственные нужды.
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace Waitable
{
public class WaitableTimer
{
[DllImport("kernel32.dll")]
private static extern IntPtr CreateWaitableTimer(
IntPtr lpTimerAttributes,
bool bManualReset,
string lpTimerName);
[DllImport("kernel32.dll")]
private static extern bool SetWaitableTimer(
IntPtr hTimer,
[In] ref long pDueTime,
int lPeriod,
IntPtr pfnCompletionRoutine,
IntPtr lpArgToCompletionRoutine,
bool fResume);
[DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
private static extern Int32 WaitForSingleObject(IntPtr handle, uint milliseconds);
private static IntPtr handle;
private static Thread mainwait; // давайте жить дружно
private static void SetWaitForWakeUpTime(object input)
{
long duetime=(long)input;
input=null;
handle=CreateWaitableTimer(IntPtr.Zero,true,"LOL_Bot_WaitableTimer");
SetWaitableTimer(handle,ref duetime,0,IntPtr.Zero,IntPtr.Zero,true);
uint INFINITE = 0xFFFFFFFF;
int ret=WaitForSingleObject(handle,INFINITE);
mainwait=null;
}
public static void SetWakeUp(TimeSpan delay)
{
mainwait=new Thread(WaitableTimer.SetWaitForWakeUpTime);
mainwait.Start(-delay.Ticks);
}
}
}
Из-вне вызывается оч просто: WaitableTimer.SetWakeUp(new TimeSpan(0,0,5,0,0));
Перевод в такты и отрицательная задержка делаются «на месте». Абсолютное время (положительная задержка) ещё не пробовал.
Что тут не так ? Как разбудить компьютер ?
код абсолютно рабочий, эта функция разрешена должна быть.
using System;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.ComponentModel;
using System.Threading;
namespace WakeUPTimer
{
public class Program
{
public static void Main()
{
var timer = new WakeUP();
timer.Woken += Timer_Woken;
timer.SetWakeUpTime(DateTime.Now.AddMinutes(2));
Console.WriteLine("Go to sleep");
Thread.Sleep(TimeSpan.FromMinutes(5));
Console.WriteLine(nameof(Thread.Sleep));
Console.ReadLine();
}
private static void Timer_Woken(object sender, EventArgs e)
{
Console.WriteLine(nameof(Timer_Woken));
}
}
class WakeUP
{
[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);
public event EventHandler Woken;
private BackgroundWorker bgWorker = new BackgroundWorker();
public WakeUP()
{
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
}
public void SetWakeUpTime(DateTime time)
{
bgWorker.RunWorkerAsync(time.ToFileTime());
}
void bgWorker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
if (Woken != null)
{
Woken(this, new EventArgs());
}
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
long waketime = (long)e.Argument;
using (SafeWaitHandle handle =
CreateWaitableTimer(IntPtr.Zero, true,
this.GetType().Assembly.GetName().Name.ToString() + "Timer"))
{
if (SetWaitableTimer(handle, ref waketime, 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());
}
}
}
}
}
пробуждение из гибернации иная тема, если что.
единственное НО, в моем случае комп вернулся на экран блокировки, но сессия пользователя все еще активна.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)