Прикосновение к кнопке WPF иногда не вызывает обработчик щелчка под Windows 8
" когда окно приложения не имеет фокуса, иногда обработчик щелчка не вызывается при нажатии кнопки."
система:
Windows 8.1 с сенсорным устройством ввода.
программное обеспечение:
простое приложение WPF 4.5.2 с одной кнопкой, которая регистрирует, если вызывается обработчик щелчка (просто создайте новый проект и добавьте кнопку с обработчиком щелчка в Файл MainWindow).
явление:
обычно при касании кнопки вызывается ее обработчик щелчка. но когда окно приложения не имеет фокуса, иногда обработчик щелчка не вызывается на кнопке-touch (хотя цвет кнопки меняется на синий). Когда окно приложения уже имеет фокус, прикосновение к кнопке работает все время. Это происходит только иногда, но происходит в разных системах с разными коснитесь аппаратного обеспечения (Все windows 8.1). Я никогда не испытывал этого на windows 7. С помощью мыши он работает независимо от того, сфокусировано окно или нет.
(происходит в режиме выпуска и отладки, с подключенным отладчиком и без него)
тестирование:
Я проверил различные настройки в Windows и играл с ним. Я также перекалибрую touch - > нет разницы.
при проверке мыши кнопки WPF и сенсорных событий, а затем в случае ошибки последнее полученное событие-PreviewMouseUp, но без щелчка!
когда я смотрю на полученные сообщения окна (spy++), я получаю следующее (WM_IME_SETCONTEXT, WM_GETTEXT, WM_NCHITTEST, WM_GETOBJECT удалены для лучшего обзора):
получен щелчок:
R WM_POINTERACTIVATE pmsd->lResult:FFFFFFFFFFFFFFFF
S WM_MOUSEACTIVATE hwndTopLevel:000503F8 nHittest:HTCLIENT uMsg:WM_POINTERDOWN
R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S WM_WINDOWPOSCHANGING lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGING
S WM_WINDOWPOSCHANGED lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGED
S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
R WM_ACTIVATEAPP
S WM_NCACTIVATE fActive:True
R WM_NCACTIVATE
S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
R WM_IME_NOTIFY
S WM_SETFOCUS hwndLoseFocus:(null)
R WM_SETFOCUS
R WM_ACTIVATE
S message:0x02CC [Unknown] wParam:00000000 lParam:00C50BA8
R message:0x02CC [Unknown] lResult:00000100
P WM_POINTERENTER wPointerID:0099 wFlags:6017
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:145 yPos:62
R WM_POINTERCAPTURECHANGED
P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:145 yPos:62
P WM_POINTERLEAVE wPointerID:0099 wFlags:6000
P WM_LBUTTONUP fwKeys:0000 xPos:145 yPos:62
P WM_MOUSEMOVE fwKeys:0000 xPos:145 yPos:62
S WM_CAPTURECHANGED hwndNewCapture:000503F8
R WM_CAPTURECHANGED
S WM_CAPTURECHANGED hwndNewCapture:00000000
R WM_CAPTURECHANGED
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:145 yPos:62
Нажмите не получено
S message:0x02CC [Unknown] wParam:00000000 lParam:00AE0BA9
R message:0x02CC [Unknown] lResult:00000100
R WM_POINTERACTIVATE pmsd->lResult:FFFFFFFFFFFFFFFF
S WM_MOUSEACTIVATE hwndTopLevel:000503F8 nHittest:HTCLIENT uMsg:WM_POINTERDOWN
R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S WM_WINDOWPOSCHANGING lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGING
S WM_WINDOWPOSCHANGED lpwp:000000E9E3D9E410
R WM_WINDOWPOSCHANGED
S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
R WM_ACTIVATEAPP
S WM_NCACTIVATE fActive:True
R WM_NCACTIVATE
S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
R WM_IME_NOTIFY
S WM_SETFOCUS hwndLoseFocus:(null)
R WM_SETFOCUS
R WM_ACTIVATE
P WM_POINTERENTER wPointerID:0090 wFlags:6017
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:147 yPos:39
R WM_POINTERCAPTURECHANGED
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:147 yPos:39
P WM_POINTERLEAVE wPointerID:0090 wFlags:6000
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP
R WM_SETCURSOR fHaltProcessing:False
P WM_LBUTTONUP fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
R WM_SETCURSOR fHaltProcessing:False
P WM_MOUSEMOVE fwKeys:0000 xPos:147 yPos:39
в ошибке есть дополнительные строки
S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP
R WM_SETCURSOR fHaltProcessing:False
перед WM_LBUTTONUP. Но я не знаю, имеет ли это значение.
Я уже пытался отладить .net-код, чтобы увидеть, какое условие заставляет не вызывать обработчик щелчка, но я скоро потерялся в системе.Окна.Вход.InputManager и функция PromoteMainToMouse () системы.Окна.Вход.StylusLogic.
у меня действительно заканчиваются идеи, что проверить. Поэтому было бы здорово, если бы кто-то мог дать мне совет, что еще проверить или где установить точки останова в .net, чтобы найти первопричину. Или даже лучше найдите решение / обходной путь.
обновление:
я узнал, что я могу воспроизвести явление, если указатель мыши находится недалеко отошла от окна приложения (по крайней мере на нашем сайте). И вероятность возникновения ошибки, похоже, увеличивается со сложностью пользовательского интерфейса – мое тестовое приложение не всегда не распознает щелчок, но сложное приложение WPF терпит неудачу каждый раз.
вы должны иметь возможность воспроизвести его с помощью WPF developer studio (например, версия 2013) в Windows 8.1 с сенсорным устройством:
- откройте студию разработчика, чтобы покрыть только половину сенсорного экрана
- переместите перемещение так, чтобы курсор указывал на область рабочего стола
- нажмите на кнопку (например "начать отладку" – кнопка Play): в моем случае первое касание не вызывает событие click.
1 ответов
это оказалось ошибкой в WPF. Существует обходной путь, доступный до выпуска КБ.
обходным путем является вызов Mouse.Synchronize();
на PreviewTouchDown
обработчик событий затронутого UIElement MainWindow.
Я проверял и он работает отлично.