線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4740
推到 Plurk!
推到 Facebook!

強行關閉視窗

缺席
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-12 10:42:14 IP:59.127.xxx.xxx 訂閱
我用過SendMessage、PostMessage的方式(WM_QUIT和WM_CLOSED)
也試過用ExitProcess
甚至是用TerminateProcess的方式去關閉一視窗
TerminateProcess(hProcess, 0);
視窗卻關不掉,依然存在
用GetLastError取得的資訊為ERROR_NO_MORE_FILES
很奇怪的是視窗明明就存在,為何會ERROR_NO_MORE_FILES
視窗用FindWindow也確實找到,但視窗偏偏就不讓我關閉
請問各位前輩,是否還有其它的方式可以強行關閉視窗?

ps.我只能從工作管理員的應用程式裡,選擇此視窗再按工作結束才能關閉此視窗
編輯記錄
anyone 重新編輯於 2007-06-12 10:46:28, 註解 無‧
anyone 重新編輯於 2007-06-12 11:05:57, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-12 12:05:39 IP:61.222.xxx.xxx 訂閱
SetPrivilegeToken , SeDebugPrivilege'
設定 DEBUG權限後在 TerminateProcess
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-12 13:28:17 IP:59.127.xxx.xxx 訂閱
您的意思是以下的方式嗎? <textarea class="delphi" rows="10" cols="60" name="code"> OpenProcessToken(...) if (LookupPrivilegeValue(...)) begin ... if AdjustTokenPrivileges(...) then ... end; TerminateProcess(); </textarea>
我試了,一樣耶! 還是不能關掉視窗 ===================引 用 wameng 文 章===================
SetPrivilegeToken?, SeDebugPrivilege'
設定 DEBUG權限後在 TerminateProcess
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-13 13:24:36 IP:59.127.xxx.xxx 訂閱
已解決。
我要的視窗可以收到
<textarea class="delphi" rows="10" cols="60" name="code"> PostMessage(Handle, WM_CLOSE,0,0); </textarea> 的訊息,不過要用while一直送才行 奇怪的是用TerminateProcess居然行不通 不解....真是怪視窗
SleepWalker
一般會員


發表:16
回覆:20
積分:12
註冊:2004-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-14 18:16:28 IP:220.229.xxx.xxx 訂閱
{ For Windows 9x/ME/2000/XP }
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) <> 0 do
begin
try
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
(UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
begin
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
end;

ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
except
Integer(ContinueLoop) := 0;
end;
end;
CloseHandle(FSnapshotHandle);
end;
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-22 10:45:32 IP:59.127.xxx.xxx 訂閱
這個一樣用的是TerminateProcess的方式
這位前輩,我有用過這方法,沒有用
所以我才問有沒有其它方法
還是謝謝您
===================引 用 SleepWalker 文 章===================
{ For Windows 9x/ME/2000/XP }
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) <> 0 do
? begin
??? try
????? if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
????????? (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
????? begin
??????? Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
????? end;

????? ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
??? except
????? Integer(ContinueLoop) := 0;
??? end;
? end;
? CloseHandle(FSnapshotHandle);
end;
系統時間:2024-03-29 9:20:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!