用 ExitWindowsEx 重新启动智能手机

本文介绍如何使用WindowsMobileVersion5.0SDK中的ExitWindowsEx函数创建一个简单的重启程序。该程序适用于HTCTornado(Dopod577w)及其他QVGA分辨率的WindowsMobile5Smartphone设备。

  我玩 Windows Mobile 也有两年多的时间了。但是大多数时间还是玩得多,自己动手少。最近入手一个 HTC Tornado(Dopod 577w),突然想到要自己做一个方便重新启动的程序,这样可以不用再关机、开机地折腾。

  查了下 Windows Mobile Version 5.0 SDK,发现了一个新增的函数:ExitWindowsEx。要说这个函数对于 Windows Application 开发人员来说也不算陌生。但是对于 Windows Mobile 却是新的。看一下在 C# 中的声明。

        [DllImport("Aygshell.dll")]
        static extern bool ExitWindowsEx(uint uFlags, int dwReserved);

  其中 uFlags 的值对于 Smartphone 版本来说可以是 EWX_POWEROFF 或者 EWX_REBOOT。可以这样定义:

        private const uint EWX_REBOOT = 2;
        private const uint EWX_POWEROFF = 8;

  调用这个方法就更简单了:

        ExitWindowsEx(EWX_REBOOT, 0);  // 重新启动设备

  很容易吧。我为 Tornado 专门做了一个小程序,也适用于其他 QVGA 分辨率的 Windows Mobile 5 Smartphone(由于时间有限,而且用的是 .NET CF 1.0,所以没有写根据设备分辨率自动调整画面的代码)。

  这个小玩具可以在下列地址找到:http://forum.xda-developers.com/viewtopic.php?t=43553

ExitWindowsEx函数可以退出、重启或注销系统。其函数原型如下: ```cpp BOOL ExitWindowsEx( UINT uFlags, // 关闭参数 DWORD dwReserved // 系统保留,一般取0 ); ``` 函数参数说明: - `uFlags`:指定关闭的类型,此参数必须有下列值的组合: - `EWX_FORCE`:强制终止进程。当此标志设置,Windows不会发送消息`WM_QUERYENDSESSION`和`WM_ENDSESSION`给目前在系统中运行的程序,这可能会导致应用程序丢失数据,因此应该只在紧急情况下使用此标志。 - `EWX_LOGOFF`:关闭所有进程,然后注销用户。 - `EWX_POWEROFF`:关闭系统并关闭电源,该系统必须支持断电。 - `EWX_REBOOT`:关闭系统,然后重新启动系统。 - `EWX_SHUTDOWN`:关闭系统,安全地关闭电源,所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。 - `dwReserved`:系统保留,此参数被忽略,一般取0 [^3]。 函数返回值: - 如果函数成功,返回值为非零。 - 如果函数失败,返回值是零。想获得更多错误信息,请调用`GetLastError`函数 [^3]。 在不同系统下的使用情况: - 在Win9x下,只要简单地调用`ExitWindowsEx`函数就可以实现关机或者重新启动。 - 在Win 2000/XP下调用`ExitWindowsEx`函数时,还需要先调用`AdjustTokenPrivileges`函数 [^2]。 以下是使用示例: ```cpp // 注销当前用户 ExitWindowsEx(EWX_LOGOFF, 0); // 重启 ExitWindowsEx(EWX_REBOOT, 0); ``` 另外,在C++中实现工控机重启的示例代码如下: ```cpp void CReCDlg::RestartComputer() { HANDLE hToken; TOKEN_PRIVILEGES Privi; // 获取此进程的令牌。 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { AfxMessageBox("OpenProcessToken错误!"); return; } // 获取关机权限的LUID。 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Privi.Privileges[0].Luid); Privi.PrivilegeCount = 1; // 设置一个权限 Privi.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // 获取此进程的关闭权限。 AdjustTokenPrivileges(hToken, FALSE, &Privi, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL); if (GetLastError() != ERROR_SUCCESS) { AfxMessageBox("获得权限失败!"); return; } else { // 关闭系统并强制关闭所有应用程序。 ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); // 重启 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值