@Csus4

Как вытащить указатель на окно в перехваченной функции EnumWindows?

Хук на EnumWindows
//hook.h 
typedef BOOL(WINAPI *PNT_ENUMWINDOWS)(
	_In_ WNDENUMPROC lpEnumFunc,
	_In_ LPARAM      lParam
);

//hook.cpp 
PNT_ENUMWINDOWS TrueEnumWindows = (PNT_ENUMWINDOWS)::GetProcAddress(::GetModuleHandle(L"user32"), "EnumWindows");

BOOL WINAPI FalseEnumWindows(
    _In_ WNDENUMPROC lpEnumFunc,
    _In_ LPARAM      lParam
)
{
    // Если lParam содержит нужные данные, обработать их
    BOOL result = TrueEnumWindows(lpEnumFunc, lParam);
    return result;
}

Я так понимаю lpEnumFunc - просто указатель на пользовательскую callback-функцию, а все данные передаваемые в нее закодированы в lParam. Как их можно оттуда достать?
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я так понимаю 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;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Нужно знать что там закодировано.
Обычно это указатель на какую-либо структуру.

И почему не так:
PNT_ENUMWINDOWS TrueEnumWindows = ::EnumWindows;
?
Вы не используете /DEFAULTLIB для сборки?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы