Создает окно IP-адреса следующим образом, затем пытается найти его с помощью функции FindWindowEx
:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_INTERNET_CLASSES;
InitCommonControlsEx(&icex);
// hwnd is the parent of the IP address window
HWND eIpAddress = CreateWindowW(WC_IPADDRESS,
L"ServerIpAddress",
WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
MulDiv(LOWORD(units), 40, 4), 50,
MulDiv(LOWORD(units), 70, 4),
MulDiv(HIWORD(units), 11, 8),
hwnd, NULL, NULL, NULL);
// try to retrieve the control; does not work, returns null
HWND wnd_server_ipaddress = FindWindowEx(hwnd, NULL, NULL, L"ServerIpAddress");
DWORD err = GetLastError(); // --> returns 0
Но wnd_server_ipaddress
имеет значение NULL. Я делаю то же самое с двумя другими стандартными окнами редактирования, которые имеют разные имена, и это работает. Посмотрел в Spy ++, чтобы убедиться в правильности иерархии. Добавлен GetLastError()
после вызова и возвращается 0.
// works
HWND wnd_server_name = FindWindowEx(hwnd, NULL, NULL, L"ServerName");
// does not work
HWND wnd_server_ipaddress = FindWindowEx(hwnd, NULL, WC_IPADDRESS, L"ServerIpAddress");
HWND wnd_server_ipaddress2 = FindWindow(WC_IPADDRESS, L"ServerIpAddress");
// works
wchar_t server_name[512] = { 0 };
GetWindowText(wnd_server_name, server_name, 512);
// does not work because wnd_server_ipaddress is null
wchar_t server_ipaddress[16] = { 0 };
DWORD dwAddr = 0x0;
int iCount = (int)SendMessage(wnd_server_ipaddress, IPM_GETADDRESS, 0, (LPARAM)&dwAddr);
_snwprintf_s(server_ipaddress, sizeof(server_ipaddress) / sizeof(*server_ipaddress), 16,
L"%ld.%ld.%ld.%ld",
(dwAddr >> 24) & 0xff,
(dwAddr >> 16) & 0xff,
(dwAddr >> 8) & 0xff,
(dwAddr) & 0xff);
Вопрос: Есть ли что-то специфическое для WC_IPADDRESS
, которое заставляет FindWindowEx
не найти элемент управления?
Редактировать Добавлен код, который работает для стандартного управления.
// creation with ServerName as lpWindowName
HWND eName = CreateWindowW(L"Edit", L"ServerName",
WS_CHILD | WS_VISIBLE | WS_BORDER,
MulDiv(LOWORD(units), 40, 4), 10,
MulDiv(LOWORD(units), 150, 4),
MulDiv(HIWORD(units), 11, 8),
hwnd, NULL, NULL, NULL);
// reset text
SetWindowText(eName, L"");
// retrieve control - works
HWND wnd_server_name = FindWindowEx(hwnd, NULL, NULL, L"ServerName");
// retrieve value - works, gets whatever the text in the control is
wchar_t server_name[512] = { 0 };
GetWindowText(wnd_server_name, server_name, 512);