用form1.hide隐蔽正在运行的程序后计算机无法关闭???(100分)

C

cxrcg

Unregistered / Unconfirmed
GUEST, unregistred user!
我用form1.hide隐蔽正在运行的程序后,如果不先停止程序运行,
则计算机无法关闭???如何解决!
 
如果你用的是win2000的话,可以用任务管理器关掉它。
 
是不是用了udp,呵呵!
添加一条捕获系统WM_QUIT的消息
然后在自己的消息处理程序中写关机函数
ExitWindows()
 
楼上的再具体一点
 
win2000下关机函数,自己改吧
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
var
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
OSVersion : String;
begin
OSVersion =GetVersion;
if Pos( 'Windows NT', OSVersion ) = 1 then // we've got to do a whole buch of things
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
{------------------- 为什么要重复!!??
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
-------------------}

// SE_SHUTDOWN_NAME
if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );
Exit;
end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );
Exit;
end // if Boolean( GetLastError() )
else
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end // if OSVersion = 'Windows NT'
else
begin // just shut the machine down
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end; // else
end;
 
捕获系统消息
这样
procedure GetQuit(msg:TMessage);message WM_QUIT;
然后按ctrl + C
在产生的代码中写你自己的关机函数
可以用ExitWindows
在nt下也可以使用上面我给你的函数,你可以自己写个读版本的程序
哎!还是给你一个吧,自己用用心,OSVersion 可以调用GetVersion
返回的字符串
function GetVersion: String;
var
VersionInfo : TOSVersionInfo;
OSName : String;
begin
// 设置长度
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
//调用获得系统版本的函数
if Windows.GetVersionEx( VersionInfo ) then
begin
with VersionInfo do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s : OSName := 'Win32s';
VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';
VER_PLATFORM_WIN32_NT : OSName := 'Windows NT';
end;
Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
#13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
end;
end
else
Result := '';
end;
 
顶部