У меня есть сторонний контроль с открытым исходным кодом (неважно, какой именно, но его браузер Chromium от CefSharp [v 43]).C# Windows (touch -> click/focus) сообщения между Form и элементами управления (WM_xxx)
Изначально возникла проблема, когда при нажатии кнопки внутри элемента меню было открыто меню формы, меню не отклонялось (как если бы элемент управления проглатывал событие щелчка).
Чтобы обойти это, пример приложение предложило перехватить WM_MOUSEACTIVATE сообщений между формой и контролем, и взаимодействием путем размещения WM_NCLBUTTONDOWN обратно к элементу на форме, содержащей (в моем случае, панель бар). Это решило этот вопрос.
Однако, это создало другое. Теперь, как только вы коснетесь элемента управления (сенсорного экрана) не менее 3 раз, вы больше не можете касаться элемента вне этого элемента управления. Вы должны щелкнуть мышью по [внешнему элементу], чтобы восстановить уровень фокуса, который ему требуется, чтобы снова реагировать на события касания.
Я обнаружил, что если я также перехвачу сообщение WM_SETCURSOR (к управлению) и заблокирую насос в течение 5 мс (Thread.Sleep()), то проблема магически исчезнет.
Я хотел бы знать, что происходит. Я между теориями, что это проблема с потоками/контекстом или задержка сообщения WM_SETCURSOR, позволяет вначале обрабатывать смежное сообщение в форме (что не может быть правдой, поскольку они имеют один и тот же поток).
Итак, я проверил тест (без спала 5 мс) и записал все сообщения, полученные элементом управления и формой в режиме реального времени. Во время теста я нажал на панель панели (над браузером) с помощью мыши, а затем коснулся (длинный и короткий) различных областей внутри элемента управления, а затем снова коснулся панели (что было проигнорировано).
Вот сообщения:
10/13/2015 02:37:00.295 PM Form: WM_PARENTNOTIFY 1. [Click bar]
10/13/2015 02:37:00.295 PM Form: WM_MOUSEACTIVATE
10/13/2015 02:37:05.458 PM Chromium: WM_NCHITTEST 2. [Touch 1 -long]
10/13/2015 02:37:05.458 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:05.458 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:05.458 PM Form: 587
10/13/2015 02:37:05.458 PM Chromium: 587
10/13/2015 02:37:05.458 PM Chromium: WM_MOUSEACTIVATE
10/13/2015 02:37:05.458 PM Chromium: 585
10/13/2015 02:37:05.458 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:05.458 PM Chromium: 716
10/13/2015 02:37:05.458 PM Chromium: WM_TOUCH (x23)
10/13/2015 02:37:05.458 PM Chromium: 582
10/13/2015 02:37:05.458 PM Chromium: 581 (x22)
10/13/2015 02:37:05.674 PM Chromium: 583
10/13/2015 02:37:05.674 PM Chromium: 586
10/13/2015 02:37:05.674 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:05.674 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:05.674 PM Chromium: WM_MOUSEMOVE
10/13/2015 02:37:05.674 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:05.674 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:05.674 PM Chromium: WM_MOUSEACTIVATE
10/13/2015 02:37:05.674 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:05.674 PM Chromium: WM_LBUTTONDOWN
10/13/2015 02:37:05.674 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:05.674 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:05.674 PM Chromium: WM_LBUTTONUP
10/13/2015 02:37:10.509 PM Chromium: WM_NCHITTEST 3. [Touch 2 -long]
10/13/2015 02:37:10.509 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:10.509 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:10.509 PM Form: 587
10/13/2015 02:37:10.509 PM Chromium: 587
10/13/2015 02:37:10.509 PM Chromium: WM_MOUSEACTIVATE
10/13/2015 02:37:10.509 PM Chromium: 585
10/13/2015 02:37:10.509 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:10.509 PM Chromium: 716
10/13/2015 02:37:10.509 PM Chromium: WM_TOUCH (x27)
10/13/2015 02:37:10.509 PM Chromium: 582
10/13/2015 02:37:10.509 PM Chromium: 581 (x25)
10/13/2015 02:37:10.755 PM Chromium: 583
10/13/2015 02:37:10.755 PM Chromium: 586
10/13/2015 02:37:10.755 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:10.755 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:10.755 PM Chromium: WM_MOUSEMOVE
10/13/2015 02:37:10.755 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:10.755 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:10.755 PM Chromium: WM_MOUSEACTIVATE
10/13/2015 02:37:10.755 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:10.755 PM Chromium: WM_LBUTTONDOWN
10/13/2015 02:37:10.755 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:10.755 PM Chromium: WM_SETCURSOR
10/13/2015 02:37:10.755 PM Chromium: WM_LBUTTONUP
10/13/2015 02:37:25.525 PM Chromium: WM_NCHITTEST 4. [Touch 3 -short]
10/13/2015 02:37:25.525 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:25.525 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:25.525 PM Form: 587
10/13/2015 02:37:25.525 PM Chromium: 587
10/13/2015 02:37:25.525 PM Chromium: 585
10/13/2015 02:37:25.525 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:25.525 PM Chromium: 716
10/13/2015 02:37:25.525 PM Chromium: WM_TOUCH (x7)
10/13/2015 02:37:25.525 PM Chromium: 582
10/13/2015 02:37:25.525 PM Chromium: 581 (x5)
10/13/2015 02:37:25.586 PM Chromium: 583
10/13/2015 02:37:25.586 PM Chromium: 586
10/13/2015 02:37:30.440 PM Chromium: WM_NCHITTEST 5. [Touch 4 -short]
10/13/2015 02:37:30.440 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:30.440 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:30.440 PM Form: 587
10/13/2015 02:37:30.440 PM Chromium: 587
10/13/2015 02:37:30.440 PM Chromium: 585
10/13/2015 02:37:30.440 PM Chromium: WM_NCHITTEST
10/13/2015 02:37:30.440 PM Chromium: 716
10/13/2015 02:37:30.440 PM Chromium: WM_TOUCH (x10)
10/13/2015 02:37:30.440 PM Chromium: 582
10/13/2015 02:37:30.440 PM Chromium: 581 (x8)
10/13/2015 02:37:30.518 PM Chromium: 583
10/13/2015 02:37:30.518 PM Chromium: 586
10/13/2015 02:37:35.324 PM Form: WM_NCHITTEST 6. [Bar (i button) touch -ignored]
10/13/2015 02:37:35.324 PM Form: WM_NCHITTEST
10/13/2015 02:37:35.324 PM Form: WM_PARENTNOTIFY
10/13/2015 02:37:35.324 PM Form: 587
10/13/2015 02:37:35.324 PM Form: 282
Согласно этим, 3-ю и 4-й прикосновения сломали фокус. Мы можем видеть, что управление хромом прекратило получать последнюю связку сообщений после 586. Я предполагаю, что это отсутствие WM_PARENTNOTIFY обратно к форме, которая вызвала проблему.
Я не могу найти информацию по сообщениям 282, 581, 582, 583, 586 и 587. Я мог бы отреагировать на сообщение 586 и вручную отправить WM_PARENTNOTIFY в форму? Я не уверен, какой эффект получило бы два из них в быстрой последовательности?
Кто-нибудь знает, почему 5 мс спать на WM_SETCURSOR держит эти сообщения текущими?
Или любые лучшие идеи по исправлению?
Поскольку никто не участвовал в этом вопросе, я принимаю это как ответ, чтобы закрыть его, но я сомневаюсь в его точности. Сообщения определенно обрабатываются последовательно, поэтому есть что-то еще, что может привести к иллюзии, что у них нет – user1830285