使用 .NET CF P/Invoke 关闭 PDA 屏幕
一篇关于如何在 .NET CF 平台上关闭 PDA 屏幕的文章。
引言
在应用程序在后台运行时,关闭 PDA 屏幕以节省电量有时很有用,例如,如果您设计了一个音乐播放器,用户可能希望关闭屏幕以延长播放时间。
不幸的是,关于这个主题的文章很少。我找到的一个 C++ 程序在 MSDN 上。感谢幸运之星,我还从 OpenNET CF 找到了另一个 C# 程序。然后我将其重写并针对 VB.NET 进行了测试。
使用代码
使用此代码很容易,您只需在 PDA
命名空间下调用 Video.PowerOff
。当屏幕关闭时,您可以使用 Video.PowerOn
Sub
打开屏幕,或者您可以按下 PDA 上的电源按钮。
这里的核心函数是 "Coredll.dll" 中的 ExtEscape
。此函数允许应用程序访问特定设备的功能,这些功能无法通过图形设备接口 (GDI) 访问。此函数访问的设备功能必须由 OEM 实现。
Declare Function ExtEscapeSet Lib "coredll" Alias _
"ExtEscape" (ByVal hdc As IntPtr, _
ByVal nEscape As Int32, _
ByVal cbInput As Int32, _
ByVal plszInData As Byte(), _
ByVal cbOutput As Int32, _
ByVal lpszOutData As IntPtr) As Int32
返回值大于零表示成功,小于零表示错误。您可以从 MSDN Library 获取详细信息。
要使用此函数,首先您必须通过 GetDC
函数获得一个 hdc
。然后将 nEscape
参数设置为 SETPOWERMANAGEMENT
,其值为 0x1803。cbInput
参数是 plszInData
的长度。这里 plszInData
是某种结构。我这样定义它
Dim vpm() As Byte = {12, 0, 0, 0, 1, 0, 0, 0, _
VideoPowerState.VideoPowerOff, 0, 0, 0, 0}
这里的第 9 个值来自 VideoPowerState
枚举
Public Enum VideoPowerState As Integer
VideoPowerOn = 1
VideoPowerStandBy
VideoPowerSuspend
VideoPowerOff
End Enum
最后的参数 cbOutput
和 lpszOutData
应设置为零。最后,调用 ExtEscapeSet
函数来关闭/打开屏幕。
虽然该函数工作良好,但我对 plszInData
的结构以及 ExtEscape
函数的额外用途感到困惑。有人能告诉我关于它吗?谢谢!
关注点
联系我
感谢您的阅读和使用我的代码。