如何關閉其他的應用程序
發表于:2007-07-14來源:作者:點擊數:
標簽:
問題 有的 程序員 希望能夠從自己的應用程序中啟動其他的應用程序,并在操作完成后關閉應用程序。例如: 從應用程序中啟動 Windows 應用程序 Write,作記錄或者寫備忘錄,然后關閉此應用程序。有時,還希望 能夠忽略應用程序 Write 的消息框,消息框是用來詢
問題
有的
程序員希望能夠從自己的應用程序中啟動其他的應用程序,并在操作完成后關閉應用程序。例如: 從應用程序中啟動 Windows 應用程序 Write,作記錄或者寫備忘錄,然后關閉此應用程序。有時,還希望 能夠忽略應用程序 Write 的消息框,消息框是用來詢問用戶是否保存文件的改變。
如何使用 Windows 9x API 函數盡量簡單地實現這兩個功能呢?
方法
在 3.2 節中,介紹了如何列出當前正在運行的任務以及如何激活選中的任務。本節要實現的功能類似, 但在應用程序程序中要激活的和關閉的任務一般是一定的。不過為了使本節的例子程序更具有普遍性,仍然 由用戶來選擇要關閉的應用程序,并決定使用的關閉方法。
為了實現這些功能,需要使用 Windows API 函數 PostMessage。
步驟
按照下列步驟實現一個例子程序。運行此例子程序,從菜單 Tasks 中選擇菜單項 Terminate Tasks, 將彈出一個對話框,顯示當前運行的窗口。選擇一個窗口并點擊按鈕 Close App 或按鈕 Quit App,對話 框將關閉,選中的窗口也將關閉。
啟動 Windows 應用程序 WordPad,并鍵入一些文本,
測試兩個按鈕的功能,會發現例子程序有時詢問 是否存儲已改變的文本,而有時不詢問。
實現例子程序的具體步驟如下:
1.在 Visual C++ 中,利用 AppWizard 創建新的項目文件,并命名此項目文件為 LD33.MAK.
2.進入 AppStudio 并創建新的對話框。添加一個列表框,改變按鈕 OK 的標題為 Close,刪除 Cancel 按鈕。將對話框的標題改為 Terminate Task。
3.在對話框中添兩個按鈕,標題分別為 Close App 和 Quit App。
4.進入 ClassWizard 為此對話框生成新的對話框類,類名為 CTerminateTaskDlg。從對象列表中選 擇 CTerminateTaskDlg,從消息列表中選擇消息 WM_INI
TDIALOG。點擊按鈕 Add Function,在方法 OnInitDialog 中輸入下列代碼:
BOOL CTerminateTaskDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CListBox * list=(CListBox *)GetDlgItem(IDC_LIST1);
list->ResetContent();
FARPROC EnumProcInstance=MakeProcInstance(
(FARPROC)EnumWindowsProc,AfxGetInstanceHandle());
EnumWindows((WNDENUMPROC)EnumProcInstance,(LPARAM)list);
FreeProcInstance(EnumProcInstance);
CenterWindow();
return TRUE; // return TRUE unless you set the focus to a control
}
5.在文件 TerminateTaskDlg.cpp 中,方法 OnInitDialog 的前面,添加下列代碼:
static BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
CListBox * list=(CListBox *)lParam;
char buf[256];
GetWindowText(hwnd,buf,256);
if(strlen(buf))
{
int idx=list->AddString(buf);
list->SetItemData(idx,(DWORD)hwnd);
}
return TRUE;
}
6.從對象列表中選擇 ID_BUTTON1,從消息列表中選擇消息 BN_CLICKED,命名方法為 OnCloseApp,并在此方法中添加下列代碼:
void CTerminateTaskDlg::OnCloseApp()
{
CListBox * list=(CListBox *)GetDlgItem(IDC_LIST1);
int idx=list->GetCurSel();
if(idx==LB_ERR)
{
MessageBox("You must select a window to active!",
"Error",MB_OK|MB_APPLMODAL);
return;
}
HWND hWnd=(HWND)list->GetItemData(idx);
::PostMessage(hWnd,WM_CLOSE,0,0L);
EndDialog(IDOK);
}
7.從對象列表中選擇 ID_BUTTON2,從消息列表中選擇消息 BN_CLICKED,命名方法為 OnQuitApp,并在此方法中添加下列代碼:
void CTerminateTaskDlg::OnQuitApp()
{
CListBox * list=(CListBox *)GetDlgItem(IDC_LIST1);
int idx=list->GetCurSel();
if(idx==LB_ERR)
{
MessageBox("You must select a window to active!",
"Error",MB_OK|MB_APPLMODAL);
return;
}
HWND hWnd=(HWND)list->GetItemData(idx);
::PostMessage(hWnd,WM_QUIT,0,0L);
EndDialog(IDOK);
}
8.在菜單 Tasks 中添加新的菜單項 Terminate Tasks,ID 命名為 ID_TER
MINATE_TASK。
9.在 ClassWizard 中.從下拉列表中選擇對象 CMainFrame,從對象列表中選擇 ID_TERMINATE_TASK,選擇消息 COMMAND,點擊按鈕 Add Function,在方法 OnTerminateTask 中輸入下列代碼:
void CMainFrame::OnTerminateTask()
{
CTerminateTaskDlg dlg;
dlg.DoModal();
}
10.在文件 MAINFRM.CPP 的頂部添加下列行:
#include "TerminateTaskDlg.h"
11.編譯并運行此例子程序。
用法
同前一節一樣,本節也使用了 API 函數 EnumWindows 及回調函數 EnumWindowsProc 來列出窗 口,同樣,也將 Windows 句柄存放在列表框附加數據部分。
當用戶從對話框中選擇了按鈕 Close App 后,選中的列表項及句柄將被取回。使用此句柄傳送標識 符為 WM_CLOSE 的消息給窗口,表示窗口應被關閉。使用消息 WM_CLOSE 關閉窗口,將不會提示用戶保 存已改變的文本。
當用戶從對話框中選擇了按鈕 Quit App 后,選中的列表項及句柄將被取回。使用此句柄傳送標識符 為 WM_QUIT 的消息給窗口,表示窗口應被關閉。使用消息 WM_CLOSE 關閉窗口,將會提示用戶保存已改 變的文本,并允許用戶撤消關閉窗口的請示。
原文轉自:http://www.anti-gravitydesign.com