2001年1月7日
像Microsoft Windows Media Player for Pocket PC 这样的应用程序允许用户在程序运行时关闭屏幕显示。本文将向您展示如何在您自己的应用程序中做到这一点。
你需要具备:
- The Microsoft eMbedded Visual Tools
- Microsoft eMbedded Visual C++
支持的语言
所有语言
代码...
为了简单起见,我们先试着用一个简短的WinMain 函数来关闭屏幕显示,等5秒钟,然后把显示切换回来。通过以下这些步骤,您还可以检测显示驱动程序是否支持使这个功能正常工作的电源管理换码序列。检测显示驱动程序使您可以得到在程序中使用代码所需要的所有必要信息。
为了创建这个样本程序,按以下步骤:
- 用eMbedded Visual C++新建一个简单的Pocket PC 应用程序。
- 用以下代码替换WinMain 函数中的代码:
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR pszCommandLine, int nCommandShow)
{
HDC gdc;
int iESC=SETPOWERMANAGEMENT;
gdc = ::GetDC(NULL);
if (ExtEscape(gdc, QUERYESCSUPPORT, sizeof(int), (LPCSTR)&iESC,
0, NULL)==0)
MessageBox(NULL,
L"orry, your Pocket PC does not support DisplayOff"
L"ocket PC Display Off Feature"
MB_OK);
else
{
VIDEO_POWER_MANAGEMENT vpm;
vpm.Length = sizeof(VIDEO_POWER_MANAGEMENT);
vpm.DPMSVersion = 0x0001;
vpm.PowerState = VideoPowerOff;
// Power off the display
ExtEscape(gdc, SETPOWERMANAGEMENT, vpm.Length, (LPCSTR) &vpm,
0, NULL);
Sleep(5000);
vpm.PowerState = VideoPowerOn;
// Power on the display
ExtEscape(gdc, SETPOWERMANAGEMENT, vpm.Length, (LPCSTR) &vpm,
0, NULL);
::ReleaseDC(NULL, gdc);
}
return 0;
}
- 把以下声明添加到WinMain 函数前面:
// GDI Escapes for ExtEscape()
#define QUERYESCSUPPORT 8
// The following are unique to CE
#define GETVFRAMEPHYSICAL 6144
#define GETVFRAMELEN 6145
#define DBGDRIVERSTAT 6146
#define SETPOWERMANAGEMENT 6147
#define GETPOWERMANAGEMENT 6148
typedef enum _VIDEO_POWER_STATE {
VideoPowerOn = 1,
VideoPowerStandBy,
VideoPowerSuspend,
VideoPowerOff
} VIDEO_POWER_STATE, *PVIDEO_POWER_STATE;
typedef struct _VIDEO_POWER_MANAGEMENT {
ULONG Length;
ULONG DPMSVersion;
ULONG PowerState;
} VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT;
这些声明是我从随Platform Builder 3.0一同发售的“include” 文件 PWINGDI.H 中抽取出来的。
- 现在编译并把程序下载到Pocket PC上
如果您运行程序,您将看见屏幕显示被关闭,5秒钟后恢复显示。在您的Pocket PC不支持关闭电源特性的情况下,会显示这样一条信息,“对不起,您的Pocket PC不支持关闭屏幕显示功能”。
您可以在此下载示例代码:
什么样的应用程序可以使用这个特性?
正如我前面所说的, Windows Media Player 是能使用本特性的程序中一个完美的例子,因为您在您听音乐的时候,您不必为屏幕显示消耗您宝贵的电池电力。具有类似蜂窝电话这样功能的应用程序也能在进行通话时关闭显示。另外一个有趣的应用程序是屏幕保护,它在Pocket PC被放入底座支架的时候被激活。这个程序开始显示一幅漂亮的图像,然后在同步和报警功能依然工作的情况下,关闭屏幕显示。当然,这个功能对于视频播放器来说没有什么意义,但是它对于那些需要花费时间来进行渲染或计算的程序来说是非常有用的。
须知
在没有办法能恢复屏幕显示的情况下,永远不要使用上面的代码。您应该总是可以使用一个切换键、屏幕点击或者按下任何键来恢复屏幕显示。否则,您的Pocket PC可能会因无法使用而不得不被关闭。尽管手册上说应用程序在被Pocket PC操作系统关闭的情况下,也可以保存它的所有状态, 但是如果您的程序处于挂起状态,它不保存屏幕显示的状态。(标志文档仅仅能从VeriTest得到。)这会需要您在应用程序从挂起状态恢复后,立即关闭屏幕显示。在最坏的情况下,您的应用程序会造成Pocket PC无法使用,因为它一被激活就会关闭屏幕显示。
此外,并不是所有的Pocket PC都支持这个特性,因为该特性要依靠于OEM的显示驱动程序。Terry在他的Casio E115中成功地测试了这段代码,我在 Compaq iPAQ 上进行的测试也取得了成功。
感谢来自Software 309公司的Terry Myhrer为本文寄来了原始代码。- C.M.