【发布时间】:2015-01-08 07:15:42
【问题描述】:
我正在编写一个 C# 应用程序(专门用于笔记本电脑),我想知道盖子的状态,即它什么时候打开,什么时候关闭。
在this SO answer 的帮助下,我已经使用了 pInvoke 和 Microsoft's RegisterPowerSettingNotification function。
因此,通过以上内容,我知道盖子何时关闭或打开并知道其状态, 但我想在其他任何事情继续之前得到盖子的状态。 我注意到即使盖子没有变化,也会调用回调函数,我可以检查它的参数以了解盖子的状态,但这对我不利,因为它是一个事件,我不能简单地等待让它发生(也许有另一种方法可以解决这个问题?)。
我也尝试过 PowerEnumerate 函数,但无法从中获得一些东西(也许有一些我不知道的东西可以提供帮助)
编辑 1: 我不能等待或延迟应用程序,有两个问题需要我在没有 CB 的情况下获得状态,第一个是在笔记本电脑连接到显示器时可以关闭盖子,从而允许用户使用笔记本电脑。如果用户在这种情况下启动应用程序,它不应该启动。 第二个原因是我希望应用程序对用户友好,并通知它启动或停止时会发生什么,如果我在错误的时间得到 cb,由于应用程序的内部逻辑,它可能会被忽略,然后必须等到下次我拿到cb时,我会的。
所以,(没有双关语) 有没有办法立即获取这些信息?
编辑 2: 从 cmets 看来,我不清楚我需要什么。我需要一种查询盖子状态的方法。即 - 调用一些 API 或其他东西,返回值是状态。 谢谢!
关键字:GUID_LIDSWITCH_STATE_CHANGE、WM_POWERBROADCAST、电源设置
【问题讨论】:
-
可能你没看我写的内容
-
缓存最后的结果怎么样?
-
在 WinAPI 术语中(根据需要转换为 C++/C#)如何在该事件中使用
CreateEvent()然后WaitForSingleObject();当盖子状态回调触发时,它可以将事件设置为已发出信号并且主程序可以继续。您可能希望 WFSO 调用超时,以防回调永远不会触发(此时您可以中止或假定适当的盖子状态)。 -
该应用程序需要大约 3-5 秒才能开始运行,我不想再添加任何延迟。我已经有一个可行的解决方法,但我不想就这样离开它