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指針訪問其成員,如果用下面的代碼:

  CWnd *pwnd = FindWindow(“ExploreWClass”,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的句柄只能枚舉+比較了

歷遍全部窗體,並取得他們對應的HWND進一步取得對應PID,符合已知PID的就是了,當然可能要判斷一下窗體狀態了,如果進程只有一個窗體那就不用了。

例:
如果要在列表框里顯示所有的窗口
BOOL CALLBACK EnumWindowsProc(
   HWND hwnd,       // handle to parent window
   LPARAM lParam    // application-defined value
)
{
char lpWinTitle[256];  
::GetWindowText(hwnd,lpWinTitle,256-1);  
CString m_strTitle; 
m_strTitle.Format("%s",lpWinTitle);
CListBox *p_l = (CListBox *)lParam;
if (!m_strTitle.IsEmpty())
{
   p_l->AddString(lpWinTitle);
}
return TRUE;
}

調用EnumWindows(EnumWindowsProc, (LPARAM)GetDlgItem(IDC_LIST1));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM