@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. Как их можно оттуда достать?
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Я так понимаю 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 для сборки?
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Acme Crypto Corp Нижний Новгород
от 120 000 до 180 000 руб.
Acme Crypto Corp Нижний Новгород
от 150 000 до 250 000 руб.
Acme Crypto Corp Нижний Новгород
от 80 000 до 140 000 руб.
18 авг. 2018, в 01:10
17000 руб./за проект
17 авг. 2018, в 23:00
5500 руб./за проект