Win7, два дисплея, монопольно использовать тачскрин
От: Mr. BAD GUY  
Дата: 20.12.12 11:31
Оценка:
Доброго времени суток!
Не уверен, что пишу в правильный форум, но все-же спрошу:

Клиент хочет использовать тачскрин (с поддержкой мультитача) монопольно, т.е. для одного фулскрин приложения и так, чтобы он не влиял на работу мыши. Т.е. мышь работает на одном дисплее, тачскрин на другом. Приложение самописное.

Можно ли достичь желаемого эффекта "малой кровью", т.е. без написания каких-либо драйверов?
Гуглинг дал ссылку:
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), который отвечает за преобразование пакетов от драйверов устройств в сообщения, рассылаемые приложениям?
win7 multitouch
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.