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