如何關閉其他的應用程序

發表于: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_INITDIALOG。點擊按鈕 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_TERMINATE_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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97