用SendMessage(h, WM_CLOSE, 0, 0)关闭一个外部程序时,如果该程序有退出确认窗口,能否直接把该程序关掉,绕过这个确认对话框? ( 积分

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

SP229

Unregistered / Unconfirmed
GUEST, unregistred user!
用SendMessage(h, WM_CLOSE, 0, 0)关闭一个外部程序时,如果该程序有退出确认窗口,能否直接把该程序关掉,绕过这个确认对话框? ( 积分: 50 )<br />如题。如果这个记事本的内容有改变时会提示:该文件有改动是否保存?
如何让它直接退出,而不出现是否保存提示?
procedure TForm1.Button1Click(Sender: TObject);
var
h: hWnd;
begin
h:=findwindow(nil,'新建 文本文档.txt - 记事本');
if h&lt;&gt;0 then
begin
SendMessage(h, WM_CLOSE, 0, 0);
end;
end;
 
获取了进程的句柄,就可以用结束进程函数api结束它,像任务管理器那样。vc中可以用BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
其它语言应该有相似的api
 
还有直接杀死进程,不过它相关的数据会丢失.
 
贴一段代码。
 
//删除进程

uses Math, Tlhelp32;
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) &lt;&gt; 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
 
接受答案了.
 
后退
顶部