對應的專案: 檢測 Word 是否在桌面
圖說: EnumWindows 藉由要求所有桌面上的視窗傳送 Window Handle 來達到列舉視窗的目的.
程式碼關鍵片段如下所示:
// MyCallBackProc
// 程式行為: EnumWindows會不斷的呼叫這個函式, 直到傳回FALSE
BOOL CALLBACK MyCallBackProc(HWND hwnd, LPARAM lParam);
void CEnumWindowsDemoDlg::OnBnClickedOk(){
CString strTarget=_T("Microsoft Word");
// 關鍵片段
BOOL bOk=EnumWindows(&MyCallBackProc,(LPARAM )&strTarget); // 檢查桌面是否有Word 這支應用程式
if(bOk==TRUE) MessageBox(_T("桌面上沒有Word"),_T("注意"),MB_OK);
}
// Callback 函式: MyCallBackProc
// 程式行為: EnumWindows會不斷的呼叫這個函式, 直到傳回FALSE
BOOL CALLBACK MyCallBackProc(HWND hwnd, LPARAM lParam){
// Step 1: 取出視窗標頭資訊
TCHAR strTitle[200];
::GetWindowText(hwnd,strTitle,200);
CString cstrTitle=strTitle;
// Step 2: 看看目前視窗是否為我們要的視窗
CString *strSpecifiedTitle=(CString*)lParam;
if(cstrTitle.Find(*strSpecifiedTitle)!=-1){
// Step 3: 對符合的視窗做進一步的處理
MessageBox(NULL,_T("發現目標視窗"),_T("找到"),MB_OK);
return FALSE; // 不需要再列舉視窗了
}else{ return TRUE; // 繼續列舉其他視窗
}
}
Window Handle
Windows 作業系統在每次視窗被建立時, 為了管理方便所配置的一個數值. Window Handle
是一個對應到視窗的數值, 在 Windows 程式設計中經常的被使用. Windows 中使用 Handle
代表視窗就好像傳統的 C 或 MSDOS 以 handle 代表一個檔案一樣. 你不應該關心 Window
Handle 的實際數值為何? 那些作業系統內部的模組會自動的將 Window Handle 參考到真正
的視窗.