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
Re: Win7, два дисплея, монопольно использовать тачскрин
От: ononim  
Дата: 20.12.12 17:53
Оценка: 4 (1)
Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.
Как много веселых ребят, и все делают велосипед...
Re[2]: Win7, два дисплея, монопольно использовать тачскрин
От: Mr. BAD GUY  
Дата: 25.12.12 12:03
Оценка:
Здравствуйте, ononim, Вы писали:

O>Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.


Спасибо за совет, но вызов DeviceIoControl() c IOCTL_HID_ENABLE_SECURE_READ фэйлится — GetLastError() возвращает 1 (Incorrect function). В чем может быть причина? Сервис стартует с правами LocalSystem, привилегия SeTcbPrivilege устанавливается.
Re[3]: Win7, два дисплея, монопольно использовать тачскрин
От: Mr. BAD GUY  
Дата: 25.12.12 13:24
Оценка:
Здравствуйте, Mr. BAD GUY, Вы писали:

MBG>Здравствуйте, ononim, Вы писали:


O>>Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.


MBG>Спасибо за совет, но вызов DeviceIoControl() c IOCTL_HID_ENABLE_SECURE_READ фэйлится — GetLastError() возвращает 1 (Incorrect function). В чем может быть причина? Сервис стартует с правами LocalSystem, привилегия SeTcbPrivilege устанавливается.


Сорри, это я ступил — открывал USB HID мышь. Теперь открываю тач (реального устройства под рукой нет, использую виртуальный из MutliTouch Vista) : посылка IOCTL_HID_GET_INPUT_REPORT (и HidD_GetInputReport()) фейлится с ERROR_CRC.
Re[4]: Win7, два дисплея, монопольно использовать тачскрин
От: Mr. BAD GUY  
Дата: 26.12.12 10:20
Оценка:
Здравствуйте, Mr. BAD GUY, Вы писали:

MBG>Здравствуйте, Mr. BAD GUY, Вы писали:


MBG>>Здравствуйте, ononim, Вы писали:


O>>>Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.


MBG>>Спасибо за совет, но вызов DeviceIoControl() c IOCTL_HID_ENABLE_SECURE_READ фэйлится — GetLastError() возвращает 1 (Incorrect function). В чем может быть причина? Сервис стартует с правами LocalSystem, привилегия SeTcbPrivilege устанавливается.


MBG>Сорри, это я ступил — открывал USB HID мышь. Теперь открываю тач (реального устройства под рукой нет, использую виртуальный из MutliTouch Vista) : посылка IOCTL_HID_GET_INPUT_REPORT (и HidD_GetInputReport()) фейлится с ERROR_CRC.


Апдейт: Если запустить консоль драйвера (Multitouch.Driver.Console.exe) то девайс не открывается (ERROR_SHARING_VIOLATION).
Re[5]: Win7, два дисплея, монопольно использовать тачскрин
От: ononim  
Дата: 26.12.12 15:34
Оценка:
O>>>>Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.
MBG>>>Спасибо за совет, но вызов DeviceIoControl() c IOCTL_HID_ENABLE_SECURE_READ фэйлится — GetLastError() возвращает 1 (Incorrect function). В чем может быть причина? Сервис стартует с правами LocalSystem, привилегия SeTcbPrivilege устанавливается.
MBG>>Сорри, это я ступил — открывал USB HID мышь. Теперь открываю тач (реального устройства под рукой нет, использую виртуальный из MutliTouch Vista) : посылка IOCTL_HID_GET_INPUT_REPORT (и HidD_GetInputReport()) фейлится с ERROR_CRC.
MBG>Апдейт: Если запустить консоль драйвера (Multitouch.Driver.Console.exe) то девайс не открывается (ERROR_SHARING_VIOLATION).
Ну что я могу сказать — именно эти контролы вызывает виндовые приложения, которые тачпадом заведуют. Я их ковырял както по служебной необходимости.
У микрософта есть пример — http://code.msdn.microsoft.com/windowshardware/HClient-HID-Sample-4ec99697 — он тоже не работает чтоли?
Как много веселых ребят, и все делают велосипед...
Re[6]: Win7, два дисплея, монопольно использовать тачскрин
От: Mr. BAD GUY  
Дата: 28.12.12 11:46
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>>>Теоретически: пишем сервис, который открывает HID девайс тачскрина, шлет ему IOCTL_HID_ENABLE_SECURE_READ (сервис должен иметь привилегию SeTcbPrivilege) и дальнейший инпут выгребает тока наш сервис, посылая девайсу IOCTL_HID_GET_INPUT_REPORT. Мышь ограничиваем ужным дисплеем, а апликуха на другом дисплее общается с нашим сервисом и получает инпут исключительно от него.

MBG>>>>Спасибо за совет, но вызов DeviceIoControl() c IOCTL_HID_ENABLE_SECURE_READ фэйлится — GetLastError() возвращает 1 (Incorrect function). В чем может быть причина? Сервис стартует с правами LocalSystem, привилегия SeTcbPrivilege устанавливается.
MBG>>>Сорри, это я ступил — открывал USB HID мышь. Теперь открываю тач (реального устройства под рукой нет, использую виртуальный из MutliTouch Vista) : посылка IOCTL_HID_GET_INPUT_REPORT (и HidD_GetInputReport()) фейлится с ERROR_CRC.
MBG>>Апдейт: Если запустить консоль драйвера (Multitouch.Driver.Console.exe) то девайс не открывается (ERROR_SHARING_VIOLATION).
O>Ну что я могу сказать — именно эти контролы вызывает виндовые приложения, которые тачпадом заведуют. Я их ковырял както по служебной необходимости.
O>У микрософта есть пример — http://code.msdn.microsoft.com/windowshardware/HClient-HID-Sample-4ec99697 — он тоже не работает чтоли?
Хм, у меня он даже не запускается — вызов DialogBox (который видимо создает UI) возвращает 0 и приложение завершается. Пробовал то что по ссылке и то что в составе WDK — одинаково.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.