Не удается получить сообщения WM_TOUCH в хуке

Мне нужно сделать приложение совместимым с Touch, и именно поэтому я нырнул в Windows Touch API.

Windows API для меня совершенно новый, поэтому я что-то упустил.

Вот моя проблема:
Я скачал Microsoft Пример простого приложения для жестов. Это работает хорошо, но функция жеста добавляется обработанной в WinProc, который связан с созданием HWND. Дело в том, что мое «настоящее» приложение само создает свой HWND, и поэтому я хотел бы использовать ловушку для получения сообщений WM_TOUCH.

Я пытался так в автономном приложении (никакие библиотеки DLL не использовались, как в моем реальном приложении)

//Window Parameters (Can't be modified in my original App)
//------Automatically called by an external lib in my "real app"------------
ATOM BaseApp_RegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style            = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc      = WndProc;
wcex.cbClsExtra       = 0;
wcex.cbWndExtra       = 0;
wcex.hInstance        = hInstance;
wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MTGEST));
wcex.hCursor          = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName     = MAKEINTRESOURCE(IDC_MTGEST);
wcex.lpszClassName    = (LPSTR)g_wszWindowClass;
wcex.hIconSm          = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}
//------/Automatically called by an external lib in my "real app"------------

//Create the Window of the Basic App
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
//------Automatically called by an external lib in my "real app"------------
// (....)
BaseApp_RegisterClass(hInstance);
// (....)
//------/Automatically called by an external lib in my "real app"------------

//------This is what I can add to my "real app"------------
//Register the Touch Window
RegisterTouchWindow(hWnd, 0 );
UpdateWindow(hWnd);

unsigned long threadId = GetWindowThreadProcessId(hWnd, 0);
//Hook the SENT Messages
SetWindowsHookEx(
WH_GETMESSAGE,
(HOOKPROC) HookTouchSENT,
NULL,
threadId);

//Hook the POSTED Messages
SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC) HookTouchPOSTED,
NULL,
threadId);

//------/This is what I can add to my "real app"------------
}

//------Automatically called by an external lib in my "real app"------------
//Primary WinProc of the Window (Can't be modified in my original App)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_TOUCH)LogInConsole("Caught a WM_TOUCH in the Main WndProc\n");   //WM_TOUCH is ALWAYS caught here when touch the screen
else if(message == WM_GESTURE)LogInConsole("Caught a WM_GESTURE in the Main WndProc\n");

return DefWindowProc(hWnd, message, wParam, lParam);
}
//------/Automatically called by an external lib in my "real app"------------

//------This is what I can add to my "real app"------------
//Get the 'POSTED' Messages of the Window
LRESULT CALLBACK HookTouchPOSTED(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hWnd = m_hwnd;

UINT message = ((PCWPSTRUCT)lParam)->message;

if(message == WM_TOUCH)LogInConsole("Caught a WM_TOUCH in HookTouchPOSTED\n");   //WM_TOUCH is NEVER caught here when touch the screen
else if(message == WM_GESTURE)LogInConsole("Caught a WM_GESTURE in HookTouchPOSTED\n");std::stringstream strStream; strStream<<"Received POSTED Message:"<<message<<", Hex:0x"<<std::hex<<((PCWPSTRUCT)lParam)->message<<std::endl;  //Receive the normals windows messages and although WM_GESTURENOTIFY
LogInConsole(strStream.str());

return CallNextHookEx(0,nCode, wParam, lParam);
}

//Get the 'SENT' Messages of the Window
LRESULT CALLBACK HookTouchSENT(int nCode, WPARAM wParam, LPARAM lParam)
{

HWND hWnd = m_hwnd;

UINT message = ((PCWPSTRUCT)lParam)->message;

if(message == WM_TOUCH)LogInConsole("Caught a WM_TOUCH in HookTouchPOSTED\n");   //WM_TOUCH is NEVER caught here when touch the screen
else if(message == WM_GESTURE)LogInConsole("Caught a WM_GESTURE in HookTouchPOSTED\n");

std::stringstream strStream; strStream<<"Received POSTED Message:"<<message<<", Hex:0x"<<std::hex<<((PCWPSTRUCT)lParam)->message<<std::endl;
LogInConsole(strStream.str());

return CallNextHookEx(0,nCode, wParam, lParam);
}
//------/This is what I can add to my "real app"------------

Моя проблема в том, что сообщение WM_TOUCH никогда не проходит через хуки, а только в WinProc. На самом деле я получаю только сообщение WM_GESTURENOTIFY в хуках, которое уведомляет о начале жеста, но следующие сообщения «WM_TOUCH», которые должны давать значения, никогда не перехватываются …

У кого-нибудь была эта проблема раньше?

Спасибо заранее за помощь

0

Решение

Спасибо Рэймонду за помощь. Подклассы были решением!
Итак, наконец, я снял все свои крючки и сделал так:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
//------Automatically called by an external lib in my "real app"------------
// (....)
BaseApp_RegisterClass(hInstance);
// (....)
//------/Automatically called by an external lib in my "real app"------------//------This is what I can add to my "real app"------------
//Register the Touch Window
RegisterTouchWindow(hWnd, 0 );   //If called then receive WM_TOUCH messages. Else receive WM_GESTURE messages

//----SUBCLASS THE WINDOW
UINT_PTR uIdSubclass;
DWORD_PTR dwRefData;

bool resultsc = SetWindowSubclass(
hWnd,
windowProcSubclass,
uIdSubclass,
dwRefData
);
if (resultsc) LogInConsole("Window Subclassed with success\n");
//----/SUBCLASS THE WINDOW

//------/This is what I can add to my "real app"------------
}

//------And the subclass Proc that now catches the WM_TOUCH and WM_GESTURE messages: ------------
LRESULT CALLBACK windowProcSubclass(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam,  UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{

switch (message)
{
case WM_TOUCH:
LogInConsole("CATCH A WM_TOUCH!!\n");
break;
case WM_GESTURENOTIFY:
LogInConsole("WM_GESTURENOTIFY!!\n");
break;
case WM_GESTURE:
LogInConsole("CATCH A WM_GESTURE!!\n");
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]