65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET CF P/Invoke 关闭 PDA 屏幕

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (5投票s)

2005年3月21日

CPOL

2分钟阅读

viewsIcon

50075

downloadIcon

415

一篇关于如何在 .NET CF 平台上关闭 PDA 屏幕的文章。

Sample Image

引言

在应用程序在后台运行时,关闭 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

最后的参数 cbOutputlpszOutData 应设置为零。最后,调用 ExtEscapeSet 函数来关闭/打开屏幕。

虽然该函数工作良好,但我对 plszInData 的结构以及 ExtEscape 函数的额外用途感到困惑。有人能告诉我关于它吗?谢谢!

关注点

联系我

感谢您的阅读和使用我的代码。

© . All rights reserved.