Как обнаружить нажатие (сенсорный ввод) глобально вместо щелчка мыши?

Я хочу сделать приложение, которое показывает себя при касании его экрана. Это не должно работать для click. Я посмотрел на сенсорный hanlders в Windows 7/8. Но я видел, что каждое сенсорное окно должно быть зарегистрировано в RegisterTouchWindow

TL; DR

есть ли способ получить положение точек касания за пределами моего окна (глобально)?

1 ответов


RegisterTouchWindow больше не требуется для приложений Win 8.

насколько мне известно, существует несколько способов достижения вашей цели с некоторыми ограничениями.

  1. вот эту статью работает как на Win 7 & 8. Но идентификатор поставщика и идентификатор продукта сенсорного экрана требуется. Есть вероятность, что ваше приложение не будет работать должным образом с некоторыми сенсорном устройстве.

  2. использовать RegisterPointerInputTarget на Win 8. Из моей отладки механизм касания windows 8 имеет свои уникальные характеристики. Между касанием вниз и касанием вверх все события касания будут отправлены в окно, которое получает первое событие касания, независимо от того, свернуто или покрыто другим окном или установлено ws_ex_transparent атрибут в своем более позднем периоде. События касания между одним нажатием и отпусканием могут быть переданы другому окну только в том случае, если первое окно уничтожено. Используя этот API, все события касания будут отправлены в зарегистрированное окно. Другие окна больше не могут получать события касания, пока UnregisterPointerInputTarget вызывается зарегистрированным окном, или сенсорный ввод вводится обратно в систему с помощью InjectTouchInput. "Вход, введенный зарегистрированной входной целью, не будет перехвачен."Обратите внимание,что для использования этого API требуется привилегия доступа к пользовательскому интерфейсу. Образец можно найти в здесь.

  3. крючок Windows. Для настольного приложения на Win 7/8 сенсорные события можно легко подключить с помощью SetWindowsHookEx С WH_CALLWNDPROC или WH_GETMESSAGE. Для metro app на Win 8 в цикле сообщений окна можно обнаружить только первое событие указателя. Хотя событие указателя может произойти щелчком или нажатием,GetPointerType могу сказать вам, если его сенсорный указатель или указатель мыши. Образцы для использования крючков можно найти по адресу здесь.

фрагмент кода для обработки события указателя:

switch(Msg)  
{  
...  
case WM_POINTERENTER:  
case WM_NCPOINTERDOWN:  
case WM_NCPOINTERUP:  
case WM_NCPOINTERUPDATE:  
case WM_POINTERACTIVATE:  
case WM_POINTERCAPTURECHANGED:  
case WM_POINTERDOWN:  
case WM_POINTERLEAVE:  
case WM_POINTERUP:  
case WM_POINTERUPDATE:  
    {  
        UINT32 pointerId = GET_POINTERID_WPARAM(wParam);  
        POINTER_INPUT_TYPE pointerType;  

        if (GetPointerType(pointerId, &pointerType))  
        {
            if (pointerType == PT_TOUCH)   
            {  
                ...  
            }  
        }  
    }  
    break;  
...