034 FindWindow 與 GetWindow

Post date: 2015/4/21 上午 03:44:51

HWND WINAPI FindWindow(
  __in_opt LPCTSTR lpClassName,
  __in_opt LPCTSTR lpWindowName
);

這是一個 Windows API,用於找出某個視窗…

回傳值 HWND 為該視窗的 handle,若查無此視窗則回傳0

前幾天檢查 Code 發現自己用錯了,所以記一下…

第一個參數 ClassName 指的是要詢找 Window 的 ClassName

也就是你這個視窗的類別名…例如你的視窗長下樣醬子

class CAboutThisDialog : public CDialog
{
};

在很明確的知道該類別名稱時就可以這麼做

HWND hwndAbout;
hwndAbout = ::FindWindow(_T("CAboutThisDialog"), NULL);
if(hwndAbout)
{
  // 該視窗目前存在
}

如果你不知道該類別名,可以用該視窗的標題來找,

意即那個視窗的 this.SetWindowText(); 給什麼,就用什麼來找…

例如

protected void CAboutThisDialog::OnCreate()
{
  SetWindowText(_T("About This"));
}
HWND hwndAbout = ::FindWindow(NULL, _T("About This"));

另外還有一個相同用法的 API 叫 ::FindWindowEx()

此 API 多了兩個參數,原型如下

HWND WINAPI FindWindowEx(
  __in_opt HWND hwndParent,
  __in_opt HWND hwndChildAfter,
  __in_opt LPCTSTR lpszClass,
  __in_opt LPCTSTR lpszWindow
);

第一個參數為某個視窗的 handle,意即找某個 Window 中的 Window,

而第二個參數為該 Window 中的某個子視窗,從該視窗開始向後詢找,

若 hwndParent 為0,效果就和 FindWindow() 一樣,

若 hwndChildAfter 為 0,就由 hwndParent 的第一個視窗開始往後找。

想獲得視窗中的子視窗可以使用以下 functon,

當然也有相對應的 API,多傳個父視窗 handle 而已…

CWnd* GetWindow(
  UINT nCmd 
) const;
HWND WINAPI GetWindow(
  __in HWND hWnd,
  __in UINT uCmd
);
// Example
CWnd *wndChild = GetWindow(GW_CHILD);