Я так понимаю lpEnumFunc - просто указатель на пользовательскую callback-функцию, а все данные передаваемые в нее закодированы в lParam
Неправильно понимаешь. lParam -- это не все данные, а только те, что хотел передать пользователь.
lpEnumFunc имеет следующий прототип:
BOOL CALLBACK EnumWindowsProc(
_In_ HWND hwnd,
_In_ LPARAM lParam
);
и hwnd в неё передаёт сама функция EnumWindows. Соответственно, чтобы получить hwnd нужно сделать что-то типа того:
struct enumWindowsParams {
WNDENUMPROC lpEnumProc;
LPARAM lParam;
};
BOOL CALLBACK myEnumFunc(
_In_ HWND hwnd,
_In_ LPARAM lParam
)
{
// use hwnd as needed
struct enumWindowsParams *ewp = (struct enumWindowsParams *)lParam;
return ewp->lpEnumProc(hwnd, ewp->lParam);
}
BOOL WINAPI FalseEnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
)
{
struct enumWindowsParams ewp;
ewp.lpEnumFunc= lpEnumFunc;
ewp.lParam = lParam;
BOOL result = TrueEnumWindows(myEnumFunc, (LPARAM)&ewp);
return result;
}