如何强行关闭应用程序?(100分)

  • 主题发起人 主题发起人 swpihwd
  • 开始时间 开始时间
S

swpihwd

Unregistered / Unconfirmed
GUEST, unregistred user!
在应用程序中使用 PostQuitMessage(WM_QUIT) 或 Application->Terminate() 为何不能终止应用程序?
有别的办法吗谢谢!
 
C++Builder的代码,你看看,函数名和使用方法都是一样的,uses tlhelp32
{
HANDLE m_SnapShot,hProcess;
PROCESSENTRY32 Ppe;
bool FindProc;
unsigned long pid;


Ppe.dwSize = sizeof(Ppe);

m_SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if (m_SnapShot == INVALID_HANDLE_VALUE)
{
ShowMessage("error");
}
FindProc = Process32First(m_SnapShot,&Ppe);
while (FindProc)
{
//ShowMessage(Ppe.szExeFile);
if (stricmp(Ppe.szExeFile,Edit1->Text.c_str()) == 0)
{
pid = Ppe.th32ProcessID;
ShowMessage("Find proc,pid = " + FloatToStr(Ppe.th32ProcessID));
break;
}
FindProc = Process32Next(m_SnapShot,&Ppe);
}
if((hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid)) == NULL)
{
ShowMessage("open proc error");
return ;
}

TerminateProcess(hProcess, 0xffffffff);
CloseHandle(hProcess);
}
 
为什么不行,你在Form 中放一按钮,点击一个就退出了:
procedure TForm1.Button1Click(Sender: TObject);
begin
PostQuitMessage(WM_QUIT)
end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=431776
呵呵
 
实现强制关机用已下代码!!!
unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btnShutDown: TButton;
procedure btnShutDownClick(Sender: TObject);
private
{ Private declarations }
procedure AdjustToken;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.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;

procedure TForm1.btnShutDownClick(Sender: TObject);
begin
AdjustToken;
ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_POWEROFF), $FFFF);
end;

end.
送点分给我吧!!!
作者:qbtxx
 
人家是关闭程序,不是关机
 
关机 API :
ExitWindowsDialog;
需要代码放 mail 。
 
procedure TForm1.Button36Click(Sender: TObject);
const
PROCESS_TERMINATE=$0001;
var
ExeFileName: String;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ExeFileName := 'program.exe';//你要结束的程序名称!
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
 
微程的这段代码我怎么调试通不过

在FProcessEntry32: TProcessEntry32;就说不认识.
 
SendMessage(Handle, WM_CLOSE, 0, 0);
 
微程的那段代码贴出来肯定是有意义的,为什么我调试通不过?谁试试.
 
在uses中加上TlHelp32单元就行了。代码如下

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,TlHelp32;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
PROCESS_TERMINATE=$0001;
var
ExeFileName: String;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ExeFileName := 'notepad.exe';//你要结束的程序名称!
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
end.
 
我想问强制终止应用程序有什么意义?
纯粹是方便吗?

我是菜鸟:)
 
可以DUMP成EXE文件啊!
 
看看你的代码里面是不是有循环LOOP死了出不来,如果有你必须先在里面加入判断允许退出,否则你也关不掉的。我以前也遇到过这个情况。
 
后退
顶部