用BroadcastSystemMessage向所有的程序发WM_POWERBROADCAST消息即可
(可能需要权限)
eg;
procedure Sleep;
var
BSMRecipents:Dword;
begin
BSMRecipents:=BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,@BSMRecipents,WM_POWERBROADCAST,PBT_APMQUERYSUSPEND,0);
end;
如果在2000下不行,用对应的方法获得权限(这个例子获得关几权限):
var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
End;
//Something u want to do
end;
(可能需要权限)
eg;
procedure Sleep;
var
BSMRecipents:Dword;
begin
BSMRecipents:=BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,@BSMRecipents,WM_POWERBROADCAST,PBT_APMQUERYSUSPEND,0);
end;
如果在2000下不行,用对应的方法获得权限(这个例子获得关几权限):
var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
End;
//Something u want to do
end;
解决方案 »
- 如何获取鼠标双击桌面图标的名称?
- delphi中有类似于vb中的AscW的函数吗,可以把Unicode码转换成中文
- 救命呀!俺笨,请各位江湖好汉多多相助!关于ftp端口的问题!
- 一个字段在DBGrid中显示不全,我想这样,可是不会
- 急啊!向导程序用不起!大哥大姐帮帮忙!
- 分发软件时,如何把Sql 数据库附加到Sql Server!!!!
- 我用D5做了一个含有自动完成功能的combobox控件,点击listbox中的候选项时报错,代码如下:
- 怎样返回TreeView中一个结点的所有子结点的个数
- 关于ado的问题
- 这样调用DLL为什么在XP中正常而在2000中不正常?
- 请问,做这样的系统应如何设计?(可分次加分,很奇怪我一次只能加这么多)
- 如何能在toolbar上的任意位置摆放按钮,而不是必须相左对齐?
BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,@BSMRecipents,WM_POWERBROADCAST,PBT_APMQUERYSUSPEND,0);
中的BSF_IGNORECURRENTTASK去掉。