Тема: Як отримати повiдомлання (тi якi iдуть у wndproc) ?
Маю я либу awesomium (браузер в програмi) i я намагаюся викликати в нього функцiю InjectKeyboardEvent.
В яку треба передавати msg, wParam, lParam.
Але як що це зробити напряму з WndProc то буде краш.
Через те що либа ініціалізована в одному потоцi а WndProc викликає iнший потiк.
Сорцiв лiби я не маю а навiть як би мав... Поняття не маю як це виправити.
Пiдкажiть як можна отримувати повiдомлення в тому же потоцi в якому ініціалізована либа.
Нагуглив ось таке.... Але щось воно не хоче працювати.
#include "KeyboardHook.h"
#include <stdio.h>
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
KeyboardHook* KeyboardHook::instance = 0;
KeyboardHook::KeyboardHook(HookListener* listener) : listener(listener)
{
instance = this;
HINSTANCE hInstance = GetModuleHandle(0);
printf("HOOK");
getMsgHook = SetWindowsHookEx(WH_GETMESSAGE, GetMessageProc, hInstance, GetCurrentThreadId());
}
KeyboardHook::~KeyboardHook()
{
UnhookWindowsHookEx(getMsgHook);
instance = 0;
}
void KeyboardHook::handleHook(UINT msg, HWND hwnd, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_KEYDOWN:
case WM_KEYUP:
case WM_CHAR:
case WM_DEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_SYSDEADCHAR:
case WM_SYSCHAR:
case WM_IME_CHAR:
case WM_IME_COMPOSITION:
case WM_IME_COMPOSITIONFULL:
case WM_IME_CONTROL:
case WM_IME_ENDCOMPOSITION:
case WM_IME_KEYDOWN:
case WM_IME_KEYUP:
case WM_IME_NOTIFY:
case WM_IME_REQUEST:
case WM_IME_SELECT:
case WM_IME_SETCONTEXT:
case WM_IME_STARTCOMPOSITION:
case WM_HELP:
case WM_CANCELMODE:
{
if (listener)
listener->handleKeyMessage(hwnd, msg, wParam, lParam);
break;
}
}
}
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
printf("YESSS WORK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
if (nCode == HC_ACTION)
{
MSG *msg = (MSG*)lParam;
if (wParam & PM_REMOVE)
KeyboardHook::instance->handleHook(msg->message, msg->hwnd, msg->wParam, msg->lParam);
}
return CallNextHookEx(KeyboardHook::instance->getMsgHook, nCode, wParam, lParam);
}
PS: Я поняття не маю як це можна реалiзувати...
А ще як плюс читав що наче тут справа не в потокобезпецi.