在通用 Windows 平台中使用 SetWaitableTimer
本文关键字:SetWaitableTimer Windows 平台 | 更新日期: 2023-09-27 17:56:01
我在UWP应用程序中使用来自"kernel32.dll"的SetWaitableTimer。我希望计算机因为我的应用程序而从睡眠状态唤醒。如果我在调试模式下运行该应用程序,它可以工作。如果我在发布模式下运行它,那么计算机不会唤醒。
如何使我的应用程序在实现模式下运行时唤醒计算机?
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);
}
10 通用 Windows 平台 (UWP) 应用可以使用 Win32 和 COM API 的子集。选择此 API 子集是为了支持 Windows 运行时、HTML/CSS 或其他受支持的语言或标准尚未涵盖的 Windows 运行时应用的关键方案。Windows 应用认证工具包可确保你的应用仅使用 Win32 和 COM API 的此子集。有关可在 UWP 中使用的 Win32 API,请参阅适用于 UWP 应用的 Win32 和 COM API。
遗憾的是,CreateWaitableTimer
和SetWaitableTimer
不在受支持的 API 中。我们不能在 UWP 应用中使用它们。对于 UWP 应用,它应该无法将系统从睡眠状态唤醒。但是我们可以通过使用 DisplayRequest 类来防止系统进入睡眠状态。
在没有用户输入的情况下显示视频或长时间运行的应用可以通过调用 DisplayRequest::RequestActive 来请求显示器保持打开状态。激活显示请求后,当应用可见时,设备的显示屏将保持打开状态。
有关详细信息,请参阅显示请求类的备注。
但是,如果你正在为企业开发应用,则可以尝试使用中转的 Windows 运行时组件。这样,你就能够在一个进程(桌面组件)中运行现有的桌面软件资产,同时在 UWP 应用中与此代码交互。有关更多信息,请查看此博客。