передать лямбду как функцию Windows CALLBACK не удалось - PullRequest
0 голосов
/ 08 июня 2018
static std::function<LRESULT(int nCode, WPARAM wParam, LPARAM lParam)> keyProc =
        [](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
        return 1;
    };
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, theApp.m_hInstance, NULL);

Ошибка C2664 «HHOOK SetWindowsHookExW (int, HOOKPROC, HINSTANCE, DWORD)»: невозможно преобразовать аргумент 2 из «std :: function» в «HOOKPROC» MFCTest d: \ test \ mfctest2 \ mfctest \keymaphooker.cpp 62

PS: Почему я использовал такое длинное выражение, а не авто?Потому что я хочу, чтобы оно было статичным.

Я изменил его на

auto keyProc =
        [this](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
         return 1;//return KeyboardProc(keyHook, keyMap, nCode, wParam, lParam);
    };

Он снова не работает.

ошибка C2664: 'HHOOK SetWindowsHookExW (int, HOOKPROC, HINSTANCE, DWORD) ': невозможно преобразовать аргумент 2 из' KeyMapHooker :: StartHook :: 'в' HOOKPROC '

1 Ответ

0 голосов
/ 08 июня 2018

Лямбда без сохранения состояния (такая как та, которую вы используете) действительно может быть преобразована в указатель на функцию и, таким образом, может использоваться как CALLBACK.Однако std::function не может быть конвертировано таким образом.

Обратите внимание, что тип лямбда-выражения не std::function, это безымянный тип класса ( тип закрытия лямбда-выражения).Вы можете захватить правильный тип, используя auto (который не влияет на продолжительность хранения):

static auto keyProc =
        [](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
        return 1;
    };
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, theApp.m_hInstance, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...