Захват сенсорных событий с помощью LowLevelMouseProc работает не для всех приложений - PullRequest
0 голосов
/ 18 мая 2018

tldr: Я использую LowLevelMouseProc для захвата всех сенсорных событий с сенсорного экрана.Это работает для моего приложения и некоторых других приложений, но, к сожалению, не для всех приложений.Может кто-нибудь объяснить мне, почему?

Полная история:

У меня есть приложение на C #, которое использует LowLevelMouseProc + SetWindowsHookEx для обнаружения положений касания при касанииэкран.Хук позволяет мне захватывать все касания, сделанные на сенсорном экране

  • , если мое приложение находится на переднем плане
  • для рабочего стола Windows (мое приложение свернуто)
  • для некоторых приложений, например Visual Studio или Firefox

К сожалению, этот механизм работает не для всех приложений, например, он не фиксирует прикосновения, сделанные в области отображения, покрытой Google Chrome.

  1. Означает ли это, что, например, Google Chrome, уже использует событие касания и не вызывает последующие обработчики событий (включая мой хук)?Кто-то еще сделал подобное наблюдение ?Кто-нибудь может объяснить это поведение?

Обновление: Сенсорные перехватчики работают даже в Chrome, но только в области контекстных меню (например, во всплывающем окне, которое появляется при щелчке правой кнопкой мыши).на сайте).Это может поддержать теорию, что Chrome потребляет события касания

Другие подчеркивали, что требуется, чтобы обратный вызов LowLevelMouseProc находился в отдельной DLL.Кроме того, другие говорят, что также требуется, чтобы внешнее приложение и DLL имели одинаковую архитектуру (x86, x64). См. Соответствующий пост здесь .

В моем проекте все методы обработки сенсорных событий находятся в отдельной DLL.Кроме того, обратный вызов имеет свой собственный поток.Как было сказано выше, это хорошо работает для некоторых приложений, но не для всех, независимо от того, скомпилирован ли мой проект (* .exe + * .dll) как приложение x86 / x64.

Интересно, что ловушка работает для всех приложений, включая Google Chrome, при захвате событий мыши .Для событий мыши и касания используется один и тот же обратный вызов:

[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
    public POINT pt;
    public int mouseData;
    public int flags;
    public int time;
    public UIntPtr dwExtraInfo;
}

... больше кода ...

if (wParam == WM.MOUSEMOVE)
{
    var info = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
    var extraInfo = (uint)info.dwExtraInfo;
    if ((extraInfo & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH)
    {// Touch Move
        Console.WriteLine("Touch move");
    } else
    {
        Console.WriteLine("Mouse move");
    }
}

Это означает, что сначала WM.MOUSEMOVE (= WM_MOUSEMOVE) событие должно произойти.Затем код идентифицирует события касания / мыши, просматривая info.dwExtraInfo.

Это наблюдение аналогично вопросу (1) и может означать, что Google Chrome имеет собственный сенсорный хук и не вызывает последующие обратные вызовы (возможно, по соображениям безопасности?).Кто-нибудь может это проверить?

В конечном итоге меня интересует захват всех событий касания, независимых приложения на переднем плане.Кто-нибудь знает более надежный подход?

...