Крюк для сообщений WM_TOUCH в Windows 10
Я пытаюсь создать подключаемую DLL для ловли WM_TOUCH
сообщения до того, как они попадают в ОС Windows 10. Но поскольку у меня нет сенсорного экрана, я использую только сенсорное управление MultitouchVista от мыши. Я думаю, именно поэтому я не понимаю WM_TOUCH
сообщения в моей процедуре подключения
Это действительно проблема, или Windows 10 по-разному относится к сенсорным событиям?
Вот мой код DLL:
#include <vcl.h>
#include <windows.h>
#include "ClangCpp.h"
#pragma hdrstop
#pragma argsused
#define DLLEXPORT __declspec(dllexport) __stdcall
//---------------------------------------------------------------------------
//const ULONG TOUCH_FLAGS_2(/*TWF_FINETOUCH|*/TWF_WANTPALM);
TMemo *Logger = NULL;
HHOOK hTouchHook;
typedef DynamicArray<TTouchInput> TTouchInputs;
//---------------------------------------------------------------------------
//extern "C" __stdcall __declspec(dllexport)
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//Logger->Clear();
//if (nCode < 0)
// return CallNextHookEx(0, nCode, wParam, lParam);
if (nCode == HC_ACTION)
{
// Logger->Lines->Add("HC_ACTION");
// Logger->Lines->Clear();
LPMSLLHOOKSTRUCT msg = (LPMSLLHOOKSTRUCT)lParam;
// RegisterTouchWindow(msg->hwnd, 0);
Logger->Lines->Add("Action: " + String(msg->dwExtraInfo ));
// switch (msg->message)
// {
// case WM_POINTERDOWN:
// case WM_POINTERUPDATE:
// case WM_POINTERUP:
// Logger->Lines->Add("WM_POINTER");
// POINTER_INFO pointerInfo = {};
// if (GetPointerInfo(GET_POINTERID_WPARAM(msg->wParam), &pointerInfo)) {
// POINT p = pointerInfo.ptPixelLocation;
//
// Logger->Lines->Add(String(p.x) + " : " + String(p.y));
// }
// break;
// }
// if (msg->message == WM_TOUCH)
// {
// Logger->Lines->Add("WM_TOUCH");
// TTouchInputs TouchInputs;
// TouchInputs.Length = msg->wParam;
// Logger->Lines->Add(TouchInputs.Length);
//
// if (TouchInputs.Length > 0)
// {
// if (GetTouchInputInfo((HTOUCHINPUT)msg->lParam, msg->wParam, &TouchInputs[0], sizeof(TTouchInput)))
// {
// for (int i = 0; i < TouchInputs.Length; ++i)
// {
// Logger->Lines->Add(TouchInputs[i].dwID);
// if (Inpt->dwID % 2)
// {
// return 1;
// }
// }
// }
// CloseTouchInputHandle((HTOUCHINPUT)msg->lParam);
// }
// }
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
extern "C" __stdcall __declspec(dllexport) void SetControl(TMemo* aLogger)
{
Logger = aLogger;
}
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
hTouchHook = SetWindowsHookEx(WH_MOUSE_LL,GetMsgProc, hinst, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(hTouchHook);
break;
}
return 1;
}