有没有达人知道什么方法获得的关机事件是关机还是重起事件。

搬了20多年的砖 2011-12-08 03:15:30
有没有达人知道什么方法获得的关机事件是关机还是重起事件。
...全文
150 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
战在春秋 2011-12-11
  • 打赏
  • 举报
回复
依MSDN解释,WM_QUERYENDSESSION 确实无法区分。
可以读取注册表
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shutdown Setting" 下DWORD值,来确定用户在关机对话框时的选择
如果没有此键,可新建一个,记住类型为DWORD。

官方对此值解释如下:
This entry stores the setting selected most recently from the list on the Shut Down Windows dialog box. This setting is displayed as the default the next time the dialog box appears.
0x1
Log off. Ends the session, leaving the computer running on full power.
0x2
Shut down. Ends the session and shuts down Windows 2000 so that the power can be turned off safely.
0x4
Restart. Ends the session, shuts down Windows 2000, and starts Windows 2000 again.
  • 打赏
  • 举报
回复
LS的方法98,2000的OK,不支持XP 2003以上的系统,早测试过了。多谢了.
继续等答案
淡然一笑 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kiven2010 的回复:]

C/C++ code

static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);

LookupPr……
[/Quote]
static int USER_EVENT;
……
……
switch(user_selection)
{
case:USER_EWX_POWEROFF
USER_EVENT = EWX_POWEROFF;
break;
case:USER_EWX_REBOOT
USER_EVENT = EWX_REBOOT;
break;
default:
USER_EVENT = EWX_POWEROFF;
break;
}
ExitWindowsEx(USER_EVENT ,0);
lslsyqyq 2011-12-10
  • 打赏
  • 举报
回复
关机事件是怎么获得的啊
楼主指导指导
  • 打赏
  • 举报
回复
看清楚标题:
关机事件
区分关机还是重起
gold_water 2011-12-09
  • 打赏
  • 举报
回复
好奇中。。。
zgl7903 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 blukercn 的回复:]
有没有达人知道什么方法获得的关机事件是关机还是重起事件。
[/Quote]

WM_QUERYENDSESSION lParam 按位判别,定义如下

#define ENDSESSION_LOGOFF 0x80000000
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#define EWX_FORCEIFHUNG 0x00000010

  • 打赏
  • 举报
回复

static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);

LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
ExitWindowsEx(EWX_POWEROFF,0); //关机
ExitWindowsEx(EWX_REBOOT,0); //重启
许文君 2011-12-09
  • 打赏
  • 举报
回复
我很好奇,都关机了,你还想做什么操作?判别了有什么用?
难道是开机启动?开机启动不是可以在开机中处理么?
  • 打赏
  • 举报
回复
顶起来。今天等神人解答。
  • 打赏
  • 举报
回复
如果 WM_QUERYENDSESSION 能区分重启还是关机还有必要在这里问吗?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
为什么需要获取这个,是否可以通过一些别的方式
[/Quote]
到底是神马好方法?
  • 打赏
  • 举报
回复
关键是hook什么.要准确的,重启还是关机。
  • 打赏
  • 举报
回复
hook
oyljerry 2011-12-08
  • 打赏
  • 举报
回复
为什么需要获取这个,是否可以通过一些别的方式

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧