天天看點

VC 各種情況下的視窗句柄的擷取

AfxGetMainWnd

AfxGetMainWnd擷取自身視窗句柄

HWND hWnd = AfxGetMainWnd()->m_hWnd;

GetTopWindow

函數功能:該函數檢查與特定父視窗相聯的子視窗z序(Z序:垂直螢幕的方向,即疊放次序),并傳回在z序頂部的子視窗的句柄。

函數原型:HWND GetTopWindow(HWND hWnd);

參數:

  hWnd:被查序的父視窗的句柄。如果該參數為NULL,函數傳回Z序頂部的視窗句柄。

傳回值:

    如果函數成功,傳回值為在Z序頂部的子視窗句柄。如果指定的視窗無子視窗,傳回值為NULL。

GetForegroundWindow

函數功能:該函數傳回目前系統的前台視窗的視窗句柄。

函數原型:HWND GetForegroundWindow(VOID)  

傳回值:函數傳回前台窗回的句柄。

GetActiveWindow

函數功能:該函數可以獲得與調用該方法的線程的消息隊列相關的活動視窗的視窗句柄(就是取得目前程序的活動視窗的視窗句柄)。

函數原型:HWND GetActiveWindow(VOID)

傳回值:傳回值是與調用線程的消息隊列相關的活動視窗的句柄。否則,傳回值為NULL。

GetSafeHwnd

函數功能:擷取某個視窗對象(CWnd的派生對象)指針的句柄(HWND)時,最安全的方法是使用GetSafeHwnd()函數。

通過下面的例子來看其理由:

  CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到資料總管

  HWND hwnd = pwnd->m_hwnd; //得到它的HWND

  這樣的代碼當開始得到的pwnd為空的時候就會出現一個“General protection error”,并關閉應用程式,因為一般不能對一個NULL指針通路其成員,如果用下面的代碼:

  HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND

  就不會出現問題,因為盡管當pwnd是NULL時,GetSafeHwnd仍然可以用,隻是傳回NULL

IsWindowVisible

函數功能:該函數獲得給定視窗的可視狀态。

函數原型:BOOL IsWindowVisible(HWND hWnd);

參數;

  hWnd:被測試視窗的句柄。

    如果指定的視窗及其父視窗具有WS_VISIBLE風格,傳回值為非零;如果指定的視窗及其父視窗不具有WS_VISIBLE風格,傳回值為零。由于傳回值表明了視窗是否具有Ws_VISIBLE風格,是以,即使該視窗被其他視窗遮蓋,函數傳回值也為非零。

備注:

    視窗的可視狀态由WS_VISIBLE位訓示。當設定了WS_VISIBLE位,視窗就可顯示,而且隻要視窗具有WS_VISIBLE風格,任何畫在視窗的資訊都将被顯示。

IsWindow

函數功能:該函數确定給定的視窗句柄是否标示一個已存在的視窗。 

函數原型:BOOL IsWindow(HWND hWnd);

    hWnd:被測試視窗的句柄。

    如果視窗句柄辨別了一個已存在的視窗,傳回值為TURE;如果視窗句柄未辨別一個已存在視窗,傳回值為FALSE。

FindWindow

HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );

lpClassName

  指向一個以null結尾的、用來指定類名的字元串或一個可以确定類名字元串的原子。如果這個參數是一個原子,那麼它必須是一個在調用此函數前已經通過GlobalAddAtom函數建立好的全局原子。這個原子(一個16bit的值),必須被放置在lpClassName的低位位元組中,lpClassName的高位位元組置零。

lpWindowName

  指向一個以null結尾的、用來指定視窗名(即視窗标題)的字元串。如果此參數為NULL,則比對所有視窗名。

如果函數執行成功,則傳回值是擁有指定視窗類名或視窗名的視窗的句柄。

  如果函數執行失敗,則傳回值為 NULL 。可以通過調用GetLastError函數獲得更加詳細的錯誤資訊。

SetWindowText:

至于視窗标題的改變,我們可以通過SetWindowText來實作

注:如果視窗本身屬性是不顯示标題的,這個函數的調用不會影響視窗屬性。

//Set title for application’s main frame window .

AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )

//Set title for View’s MDI child frame window .

GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title") )

//Set title for dialog’s push button control.

GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") )

其他:

1、直接得句柄 

        GetActiveWindow();        //得激活視窗句柄

        GetForegroundWindows();           //的前台視窗句柄

       AfxGetApp()->GetMainWnd()->GetSafeHwnd()      //很正常的,涉及到很多方法

2、枚舉型的

     HWND GetWindow(HWND hWnd, UINT uCmd );      //要先有hWnd,然後指明uCmd 的關系

     HWND FindWindowEx( HWND hwndParent,

                                         HWND hwndChildAfter,  

                                         LPCTSTR lpszClass, L

                                         PCTSTR zWindow);   

     //由類名和視窗标題得句柄,可能不隻一個,是以不唯一确定

3、其他參數的句柄

     程序ID:

    MARK:由句柄得ID可以用GetWindowThreadProcessId()

    而由ID的句柄隻能枚舉+比較了