2010年11月14日 星期日

FindWindow 與 GetWindow


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);

沒有留言:

張貼留言