2015-10-13 4 views
0

У меня есть сторонний контроль с открытым исходным кодом (неважно, какой именно, но его браузер 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 мс) и записал все сообщения, полученные элементом управления и формой в режиме реального времени. Во время теста я нажал на панель панели (над браузером) с помощью мыши, а затем коснулся (длинный и короткий) различных областей внутри элемента управления, а затем снова коснулся панели (что было проигнорировано).

enter image description here

Вот сообщения:

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 держит эти сообщения текущими?

Или любые лучшие идеи по исправлению?

ответ

0

После того, как я включил панели управления, кнопки и все события мыши я мог думать о, я смог обнаружить закономерность:

Это штрихом, который работал:

.... 
10/14/2015 01:00:10.263 PM Chromium: WM_NCHITTEST 
10/14/2015 01:00:10.263 PM Chromium: WM_SETCURSOR 
10/14/2015 01:00:10.263 PM Chromium: WM_MOUSEMOVE 
10/14/2015 01:00:10.263 PM Chromium: WM_NCHITTEST 
10/14/2015 01:00:10.263 PM Form: WM_PARENTNOTIFY 
10/14/2015 01:00:10.263 PM Chromium: WM_MOUSEACTIVATE    <-- 
10/14/2015 01:00:10.263 PM panelBrowserHeader: WM_NCLBUTTONDOWN <-- 
10/14/2015 01:00:10.263 PM Chromium: WM_SETCURSOR     <-- 
10/14/2015 01:00:10.263 PM Chromium: WM_LBUTTONDOWN 
10/14/2015 01:00:10.263 PM Chromium: WM_NCHITTEST 
10/14/2015 01:00:10.263 PM Chromium: WM_SETCURSOR 
10/14/2015 01:00:10.263 PM Chromium: WM_LBUTTONUP 

Это один что не сделал:

.... 
10/14/2015 01:00:15.240 PM Chromium: WM_NCHITTEST 
10/14/2015 01:00:15.240 PM Chromium: WM_SETCURSOR 
10/14/2015 01:00:15.240 PM Chromium: WM_MOUSEMOVE 
10/14/2015 01:00:15.240 PM Chromium: WM_NCHITTEST 
10/14/2015 01:00:15.240 PM Form: WM_PARENTNOTIFY 
10/14/2015 01:00:15.240 PM Chromium: WM_MOUSEACTIVATE    <-- 
10/14/2015 01:00:15.240 PM Chromium: WM_SETCURSOR     <-- 
10/14/2015 01:00:15.240 PM panelBrowserHeader: WM_NCLBUTTONDOWN <-- 
10/14/2015 01:00:15.240 PM Chromium: WM_LBUTTONDOWN 
10/14/2015 01:00:15.240 PM Chromium: WM_MOUSELEAVE  

проблема, событие WM_NCLBUTTONDOWN (быть вывешенным в качестве реакции на сообщение WM_MOUSEACTIVATE) иногда происходит после следующей запланированной WM_ Сообщение SETCURSOR. Это, похоже, создает иллюзию того, что событие касания завершилось за пределами своего исходного элемента управления, поэтому оно вызвало сообщение WM_MOUSELEAVE.

Задерживая сообщение WM_SETCURSOR, оно обеспечивает их огонь в правильном порядке.

Я до сих пор смущен этим, так как я был уверен, что насос сообщений - это одно однопотоковое время цикла, пробивающееся через каждую очередь сообщений каждого элемента управления. Поэтому, блокируя выполнение, когда мой элемент управления Chromium получил сообщение WM_CURSOR, я думал, что блокирую все очереди сообщений, существующие в этом потоке графического интерфейса.

Anywho, он ответил на вопрос о том, почему такое случайное «исправление» обходит проблему.

+0

Поскольку никто не участвовал в этом вопросе, я принимаю это как ответ, чтобы закрыть его, но я сомневаюсь в его точности. Сообщения определенно обрабатываются последовательно, поэтому есть что-то еще, что может привести к иллюзии, что у них нет – user1830285