xianjun谢谢帮我解决问题这里领分(100)

  • 主题发起人 主题发起人 hying95
  • 开始时间 开始时间
H

hying95

Unregistered / Unconfirmed
GUEST, unregistred user!
在别处找的,//让重新启动失效procedure RebootExpires;begin SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil, 0);end;这个好象不行
 
好像不能,如果热启动可以控制,那么冷启动呢
 
有一段代码,procedure operatecomputer(statue:longword);{ statue: ewx_logoff, ewx_poweroff, ewx_reboot}var hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord;begin if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken))then Exit; LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; ReturnLength :=0; AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength); if (GetLastError() <> ERROR_SUCCESS) then Exit; if (not ExitWindowsEx(statue, 0)) then Exit;end;这个过程在DLL中已经运行由定时器控制),有什么办法也拦截这个过程
 
好象改策略管理时可以实现,估计改注册表可以穿刺。
 
请问富翁们有没有办法?
 
使用Hook,钩住关机函数即可!
 
TO WHBEST 能否贴段代码?
 
自己拿下WM_QUERYENDSESSION消息,让它返回0.
 
to quanyue7613菜鸟,对消息不懂,能否给个示例
 
procedure WMQueryEndSession(var msg:TMessage); message WM_QueryEndSession; procedure TMainForm.WMQueryEndSession(var msg:TMessage); begin msg.Result:=1; //为1表示允许,为0表示不允许 end; 参考这个
 
TO asnychen好象不行 一按重新启动,系统就重启了
 
那开始误会你意思了,你是按键重启,就好比是强制重新启动,这个应该可以从操作系统上设置不允许冷启动
 
to asnhchen窗口上放个button一按这个就重启了,没拦住。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button3: TButton; procedure Button3Click(Sender: TObject); private { Private declarations } procedure WMQueryEndSession(var msg:TMessage); message WM_QueryEndSession; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure operatecomputer(statue:longword);{ statue: ewx_logoff, ewx_poweroff, ewx_reboot}var hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord;begin if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken))then Exit; LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; ReturnLength :=0; AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength); if (GetLastError() <> ERROR_SUCCESS) then Exit; if (not ExitWindowsEx(statue, 0)) then Exit;end; procedure TForm1.WMQueryEndSession(var msg:TMessage); begin msg.Result:=0; //为1表示允许,为0表示不允许 end; procedure TForm1.Button3Click(Sender: TObject);begin operatecomputer(ewx_reboot);end;end.
 
你需要在APPLICATION中处理WM_QUERYENDSESSION消息,而不是FORM1中因为WIN系统在关机的时候,是给所有程序的主窗口发送WM_QUERYENDSESSION消息的另外,这无法阻止用户直接按电源键关机或重启
 
to bahamut8348能否给个例子
 
function TForm1.ApplicationMessage(var Message: TMessage): Boolean;begin Result:= Message.Msg = WM_QUERYENDSESSION; if Result then Message.Result:= 0;end;procedure TForm1.FormCreate(Sender: TObject);begin Application.HookMainWindow(ApplicationMessage);end;procedure TForm1.FormDestroy(Sender: TObject);begin Application.UnhookMainWindow(ApplicationMessage);end;
 
to bahamut8348执行下面事件,电脑又重新启动,没拦住procedure TForm1.btn4Click(Sender: TObject);begin operatecomputer(ewx_reboot);end;
 
operatecomputer是什么东西?你先不要加其他的代码,然后编译运行我给你的代码。之后用WIN自带的关机测试。“开始--关闭计算机”这样测试看是不是也没用
 
关机,重启过程procedure operatecomputer(statue:longword);{ statue: ewx_logoff, ewx_poweroff, ewx_reboot}var hToken:THandle; tkp : TOKEN_PRIVILEGES; ReturnLength : DWord;begin if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or TOKEN_QUERY, hToken))then Exit; LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED; ReturnLength :=0; AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength); if (GetLastError() <> ERROR_SUCCESS) then Exit; if (not ExitWindowsEx(statue, 0)) then Exit;end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部