VC++進行視窗列舉

米小鳶發表於2016-12-19

借鑑內容來自VC++驛站:VC驛站

①、使用 GetWindow 進行視窗列舉:


This function retrieves the handle to a window that has the specified relationship to the specified window. 


HWND GetWindow( 
  HWND hWnd, 
  UINT uCmd 
); 

Parameters:
hWnd 
[in] Handle to a window. The window handle retrieved is relative to this window, based on the value of the uCmd parameter. 
uCmd 
[in] Specifies the relationship between the specified window and the window whose handle is to be retrieved.

TCHAR titleText[MAX_PATH] = {0};
HWND nHwnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while(nHwnd != NULL) {
::GetWindowText(nHwnd, titleText, MAX_PATH);
if (_tcslen(titleText) > 0) MessageBox(titleText);


nHwnd = ::GetWindow(nHwnd, GW_HWNDNEXT);
}

②、使用 FindWindowEx 進行視窗列舉:


1)This function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. 


HWND FindWindow( 
  LPCTSTR lpClassName, 
  LPCTSTR lpWindowName 
); 


Parameters:
lpClassName 
[in] Long pointer to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero. 
lpWindowName 
[in] Long pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match. 

2)The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window. This function does not perform a case-sensitive search. 
Syntax

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


Parameters:
hwndParent
[in] Handle to the parent window whose child windows are to be searched. 
If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop. 
Microsoft Windows 2000 and Windows XP: If hwndParent is HWND_MESSAGE, the function searches all message-only windows. 

hwndChildAfter
[in] Handle to a child window. The search begins with the next child window in the Z order. The child window must be a direct child window of hwndParent, not just a descendant window. 
If hwndChildAfter is NULL, the search begins with the first child window of hwndParent. 
Note that if both hwndParent and hwndChildAfter are NULL, the function searches all top-level and message-only windows. 

lpszClass
[in] 
Pointer to a null-terminated string that specifies the class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be placed in the low-order word of lpszClass; the high-order word must be zero.
If lpszClass is a string, it specifies the window class name. The class name can be any name registered with RegisterClass or RegisterClassEx, or any of the predefined control-class names, or it can be MAKEINTATOM(0x800). In this latter case, 0x8000 is the atom for a menu class. For more information, see the Remarks section of this topic.

lpszWindow
[in] Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match. 

TCHAR titleText[MAX_PATH] = {0};
HWND nHwnd = ::FindWindow(NULL, NULL);
while(nHwnd != NULL) {
::GetWindowText(nHwnd, titleText, MAX_PATH);
if (_tcslen(titleText) > 0) MessageBox(titleText);

nHwnd = ::FindWindowEx(0, nHwnd, NULL, NULL);
}

③、使用 EnumWindows 進行視窗列舉:


This function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE. 


BOOL EnumWindows( 
  WNDENUMPROC lpEnumFunc, 
  LPARAM lParam 
); 


Parameters:
lpEnumFunc 
[in] Long pointer to an application-defined callback function. For more information, see EnumWindowsProc. 
lParam 
[in, out] Specifies an application-defined value to be passed to the callback function. 

EnumWindows(EnumWindowsProc, NULL);
……
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR titleText[MAX_PATH] = {0};
::GetWindowText(hwnd, titleText, MAX_PATH);
if (_tcslen(titleText) > 0) AfxMessageBox(titleText);

return TRUE;
}

④、使用 EnumChildWindows 進行子視窗的列舉:


EnumChildWindows 照比 EnumWindows 只是多了一個指定父視窗的視窗控制程式碼的引數.


The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function. EnumChildWindows continues until the last child window is enumerated or the callback function returns FALSE.
Syntax

BOOL EnumChildWindows(          HWND hWndParent,
    WNDENUMPROC lpEnumFunc,
    LPARAM lParam
);


Parameters:
hWndParent
[in] 
Handle to the parent window whose child windows are to be enumerated. If this parameter is NULL, this function is equivalent to EnumWindows.
Windows 95/98/Me: hWndParent cannot be NULL.

lpEnumFunc
[in] Pointer to an application-defined callback function. For more information, see EnumChildProc. 
lParam
[in] Specifies an application-defined value to be passed to the callback function. 
Return Value

⑤、使用 FindWindow 進行視窗的查詢:
HWND hCalc = ::FindWindow(_T("SciCalc"), _T("計算器"));
if (hCalc){
::SetWindowText(hCalc, _T("VC驛站 專用計算器!"));
}

⑥、使用 FindWindowEx 進行子視窗的查詢:
HWND hCalc = ::FindWindow(_T("SciCalc"), _T("計算器"));
if (hCalc){
::SetWindowText(hCalc, _T("VC驛站 專用計算器!"));
HWND hEdit = ::FindWindowEx(hCalc, NULL, _T("Edit"), NULL);
::SetWindowText(hEdit, _T("1234567890"));
//::SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)_T("1234567890"));
}

⑦、鑑於 FindWindowEx 找子控制元件的不確定性,
可以使用 GetDlgItem 來獲取對話方塊內部的子控制元件視窗控制程式碼:
HWND hEdit = ::GetDlgItem(hCalc, 0x193);


相關文章