C++: Close other programs

Posted: 一月 21, 2008 in 非關分類
標籤:, ,

上一篇文章中我們提到可以利用 SendMessage 方式主動關閉程式

那如果我今天想要關閉的程式非自己撰寫的 要怎麼作呢?

運用的技巧是透過取得該程式的 Window Caption 再來取得其 handle

在已知其 Caption 時可以透過於 OnTimer 函示中 加入如下程式來定時檢查並關閉

假設我們要關閉之程式為 “foobar v0.9.5 "


HWND hfoobar = ::FindWindow(NULL, "foobar2000 v0.9.5");
    if (hfoobar)
    {
        ::SendMessage( hfoobar, WM_SYSCOMMAND, SC_CLOSE, 0 );
    }

但如果今日 軟體改版 (ex: foobar v0.9.6) 時 是否程式就沒有用了呢 !?

其實此時就需要透過 Partial Match 來操作例如

if(Caption.find(“foobar")){
// Close this window!
}

思考邏輯是挺簡單的….

但遺憾的是 FindWindow() 必無類似 Partial Match 的使用方式可以參照…

所以必須要透過 列舉的方式依序遊走 Windows 來找出所要之 handle

實作方法如下程式碼所示


CString strCaption;

    ASSERT_VALID(AfxGetMainWnd());
    CWnd *pWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
    while(pWnd){
        if(pWnd->IsWindowVisible() && pWnd->GetWindowTextLength() && !pWnd->GetOwner())
        {
            pWnd->GetWindowText(strCaption);
            if(strstr(strCaption, "Microsoft Internet Explorer")){
                ::SendMessage( pWnd->GetSafeHwnd(), WM_SYSCOMMAND, SC_CLOSE, NULL );
            }
        }
        pWnd = pWnd->GetWindow(GW_HWNDNEXT);
    }
  1. 先得到主視窗 handle
  2. while 迴圈內 依序比較各 window 的 caption
  3. 如果符合要求 則關閉該視窗

如上例 即可關閉所有 IE 視窗… 搭配上 Timer() 則可定時檢驗….

做到類似 家長管控小孩子上網的動作…

1. 參考網頁

  • FindWindow – [1]、[2]、[3]
  • 遞迴 – [1]
  • AfxGetMainWnd – [2]

2. 遇到困難

  • 僅可關閉工作列知識窗 對藏身於 SysTray 中之程式沒辦法關閉
  • 下個目標 – 研讀如何 Kill Process ..

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s