Использование SetWaitableTimer в универсальной платформе Windows
Я использую SetWaitableTimer из "kernel32.dll" в моем приложении UWP. Я хочу, чтобы компьютер проснулся из-за моего приложения. Если я запускаю приложение в режиме отладки, оно работает. Если я запускаю его в режиме выпуска, компьютер не просыпается.
Как я могу сделать так, чтобы мое приложение разбудило компьютер, когда оно работает в режиме реализации?
private void Button_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(SetWaitForWakeUpTime);
}
[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.dll", SetLastError = true)]
public static extern Int32 WaitForSingleObject(IntPtr handle, uint milliseconds);
static IntPtr handle;
static void SetWaitForWakeUpTime()
{
long duetime = -600000000;
handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer");
SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true);
uint INFINITE = 0xFFFFFFFF;
int ret = WaitForSingleObject(handle, INFINITE);
}
1 ответ
Приложения Windows 10 Universal Windows Platform (UWP) могут использовать подмножество Win32 и COM API. Это подмножество API было выбрано для поддержки ключевых сценариев для приложений среды выполнения Windows, которые еще не были охвачены средой выполнения Windows, HTML/CSS или другими поддерживаемыми языками или стандартами. Windows App Certification Kit гарантирует, что ваше приложение использует только этот поднабор Win32 и COM API. API-интерфейсы Win32, которые можно использовать в UWP, см. В разделе API-интерфейсы Win32 и COM для приложений UWP.
К несчастью, CreateWaitableTimer
а также SetWaitableTimer
не в поддерживаемых API. Мы не можем использовать их в приложениях UWP. Для приложения UWP оно не должно выводить систему из спящего режима. Но мы можем предотвратить спящий режим системы с помощью класса DisplayRequest.
Приложения, которые показывают видео или работают в течение продолжительных периодов времени без участия пользователя, могут запросить, чтобы отображение оставалось включенным, вызывая DisplayRequest:: RequestActive. Когда активирован запрос на отображение, дисплей устройства остается включенным, пока приложение является видимым.
Для получения дополнительной информации plesae см. Замечания класса DisplayRequest.
Но если вы разрабатываете приложения для предприятия, вы можете попробовать использовать Brokered Windows Runtime Components. Благодаря этому вы можете запускать существующие программные ресурсы рабочего стола в одном процессе (компонент рабочего стола), взаимодействуя с этим кодом в приложении UWP. Для получения дополнительной информации, пожалуйста, проверьте этот блог.