Доброго времени суток!
Не уверен, что пишу в правильный форум, но все-же спрошу:
Клиент хочет использовать тачскрин (с поддержкой мультитача) монопольно, т.е. для одного фулскрин приложения и так, чтобы он не влиял на работу мыши. Т.е. мышь работает на одном дисплее, тачскрин на другом. Приложение самописное.
Можно ли достичь желаемого эффекта "малой кровью", т.е. без написания каких-либо драйверов?
Гуглинг дал ссылку:
http://stackoverflow.com/questions/8010104/how-to-avoid-mouse-move-on-touch
Но, оно почему то не работает (со слов клиента, у меня нет под рукой тач устройств) — Позиционируем мышь на дисплее1, трогаем дисплей2 (тачскрин), курсор пропадает, трогаем мышь — курсор появляется на дисплее2.
Код хука:
LRESULT CALLBACK LowLevelMouseProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
if (nCode >= 0) {
static bool initState = true;
bool inputFromTouch = (GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH;
if (initState) {
g_inputSource = inputFromTouch ? IS_Touch : IS_Mouse;
initState = false;
}
if (g_inputSource == IS_Mouse && inputFromTouch) { // save current cursor pos
traceMessage(L"Input source is TOUCH, Saving cursor pos");
g_inputSource = IS_Touch;
} else if (g_inputSource == IS_Touch && !inputFromTouch) { // restore saved cursor pos
traceMessage(L"Input source is MOUSE, Restoring cursor pos");
SetCursorPos(g_cursorPos.x, g_cursorPos.y);
g_inputSource = IS_Mouse;
}
if (inputFromTouch) { // Input was generated by the touch.
return LRESULT(1);
} else { // Input was generated by the mouse.
//traceMessage(L"Mouse event from mouse, PASSED");
GetCursorPos(&g_cursorPos);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Не так давно уже была реализована подобная хотелка для тачскрина в WinXP (там он работал как HID мышь, был написан драйвер-фильтр + user mode dll, которая читает MOUSE_INPUT_DATA из драйвера, дальше приложение уже само обрабатывает эти данные как хочет).
Если я правильно понимаю, то сгенерировать WM_GESTURE и WM_TOUCH из приложения нельзя (соответствующий API появился только в Win8), следовательно, если реализовывать способ с драйвером, то придется еще реализовывать что-то навроде WM_GESTURE и WM_TOUCH, только свои, понятные только нашему приложению.
В общем буду благодарен за любые советы.
ЗЫ Нельзя ли каким-то образом использовать код из винды (м.б. некий закрытый API), который отвечает за преобразование пакетов от драйверов устройств в сообщения, рассылаемые приложениям?