為何運行所寫程序後不關閉,win2k就無法正常關機,點關機屏幕閃一下又回到桌面
(程序中只有定議快捷鍵、使用udp控件、不顯示主窗口等一些常規代碼)
(程序中只有定議快捷鍵、使用udp控件、不顯示主窗口等一些常規代碼)
解决方案 »
- 怎么得到字符串算式的值?
- 请各位推荐DELPHI学习网站和论坛
- ★为什么我的rave报表文件往硬盘保存的时候提示:Drive c:does not exist.Please verify the correct drive was given.不能保存文件。
- 用什么工具去掉ico图标的背景?
- 再加100分!在不同的分辩率下,求厘米转换成象素的算法?
- 在英文windows中,使用流写入webbrowser的网页显示的是HTML源码,怎么解决?
- 请教delphi的打印问题?
- 问一下数据库字段的小问题!!(抢分吧!)
- 关于程序的仿liveupdate升级设计
- 在我的数据库中有一个BLOB字段,我用来存图片,但怎么判断这个字段没有数据呢?
- 大家来拿高分!!!!!!!!!!
- 文件版本信息中“中文”的代码页Lang_CodePage_String是多少?我知道“英文(美国)”的Lang_CodePage_String为040904E4,但想知道中文的。
ExitWindowsEx(EWX_POWEROFF or EWX_SHUTDOWN or EWX_FORCE,0)
--------------------------------------
看见了么,
那支蛾子,
正飞向太阳,
那就是我!
--------------------------------------
好像是nmudp的問題,將控件刪了就可以正常關機了
請問有解決方法嗎?
偶自己寫的程序,有必要用中止進程的方法嗎?
偶在WM_QueryEndSession寫了結束命令,但此法要關兩次機方可,有沒有更好的辦法?
var
TP, TPPre: TTokenPrivileges;
Token: THandle;
dwLength: DWORD;
begin
result := false;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
Token);
try
TP.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, PChar(sPrivilegeName),
TP.Privileges[0].LUID) then
begin
if bEnabled then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes := 0;
dwLength := 0;
Result := AdjustTokenPrivileges(Token, false, TP, sizeof(TPPre),
TPPre, dwLength);
end;
finally
CloseHandle(Token);
end;
end;
//==========================================================
procedure Tmain.Button1Click(Sender: TObject);
begin
SetPrivilege('SeShutdownPrivilege', true);
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF, 0);
end;
菜鳥是想程序運行時點擊關機命令(或重啟、登出)時程序可以結束並順利關機(或重啟、登出)不通過程序本身利用ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF, 0)來實現。
或者哪個函數可以截獲windows的關機指令,使程序知道操作者要做的事再運行ExitWindowsEx也可
SendMessage(Self.Handle, WM_QUERYENDSESSION, 0, 0);
begin
CanClose := False;
end;
var
hdlProcessHandle : Cardinal;
hdlTokenHandle : Cardinal;
tmpLuid : Int64;
tkp : TOKEN_PRIVILEGES;
tkpNewButIgnored : TOKEN_PRIVILEGES;
lBufferNeeded : Cardinal;
Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
hdlProcessHandle := GetCurrentProcess;
OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
hdlTokenHandle);
// Get the LUID for shutdown privilege.
LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0];
// Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges(hdlTokenHandle,False,tkp,Sizeof(tkpNewButIgnored),
tkpNewButIgnored,lBufferNeeded);
exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0);
用此法不管是登出、重起命令都變成是關機了
procedure AdjustToken;
var
hdlProcessHandle : Cardinal;
hdlTokenHandle : Cardinal;
tmpLuid : Int64;
tkpPrivilegeCount : Int64;
tkp : TOKEN_PRIVILEGES;
tkpNewButIgnored : TOKEN_PRIVILEGES;
lBufferNeeded : Cardinal;
Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
hdlProcessHandle := GetCurrentProcess;
OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
hdlTokenHandle);
// Get the LUID for shutdown privilege.
LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0];
// Enable the shutdown privilege in the access token of this
// process.
AdjustTokenPrivileges(hdlTokenHandle,
False,
tkp,
Sizeof(tkpNewButIgnored),
tkpNewButIgnored,
lBufferNeeded); end;
能否解釋一下,還是沒弄明白
調用AdjustToken寫在哪裡,最終是否還應有exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0)命令
菜鳥在WMQueryEndSession中寫了,但還是要運行exitwindowsex,且沒法登出、重起
用
djyf(无聊(西湖醋鱼VS糖醋排条))
的方法
SendMessage(Self.Handle, WM_QUERYENDSESSION, 0, 0);
運行程序後必須先退出程序再運行,就能正常執行win關機命令,哪位高手知道為何?