2015-02-10 10 views
5

"Quando la finestra dell'applicazione NON ha lo stato attivo, a volte il gestore di clic non viene chiamato su pulsante-touch."Toccando un pulsante WPF a volte non si richiama il gestore di clic sotto Windows 8

Sistema:

di Windows 8.1 con un dispositivo di input multi-touch.

Software:

Una semplice applicazione WPF 4.5.2 con un solo tasto che registra se il gestore click si chiama (basta creare un nuovo progetto e aggiungere un pulsante con un gestore di clic per il MainWindow).

Fenomeno:

Normalmente quando si tocca il pulsante di scatto il suo gestore è chiamato. Ma quando la finestra dell'applicazione NON ha lo stato attivo, a volte il gestore di clic non viene chiamato su pulsante-touch (sebbene il colore del pulsante cambi in blu). Quando la finestra dell'applicazione ha già lo stato attivo, toccare il pulsante funziona sempre. Questo succede solo a volte ma si verifica su vari sistemi con diversi touch hardware (tutte le finestre 8.1). Non l'ho mai provato su Windows 7. Con il mouse funziona indipendentemente dal fatto che la finestra sia focalizzata o meno.

(accade in modalità di rilascio e di debug, con e senza debugger)

Testing:

Ho controllato le varie impostazioni tocco in finestre e ha giocato con esso. Ho anche ricalibrato il tocco -> nessuna differenza.

Quando si controlla il mouse del pulsante WPF e si toccano gli eventi, nel caso di errore l'ultimo evento ricevuto è PreviewMouseUp ma nessun clic!

Quando guardo i messaggi di finestra ricevuti (spia ++) ottengo il seguente (WM_IME_SETCONTEXT, WM_GETTEXT, WM_NCHITTEST, WM_GETOBJECT rimosso in seguito a una migliore visione d'insieme):

Click è stato ricevuto:

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 

Clicca non ricevuti

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 

Nella errore ci sono linee aggiuntive

S WM_SETCURSOR hwnd:000503F8 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONUP 
R WM_SETCURSOR fHaltProcessing:False 

prima WM_LBUTTONUP. Ma non so se questo importa.

Ho già provato a eseguire il debug del codice .net per vedere quale condizione causa non chiamare il gestore Click, ma mi sono presto perso nel System.Windows.Input.InputManager e nella funzione PromoteMainToMouse() di System.Windows.Input .StylusLogic.

Sono davvero a corto di idee su cosa controllare. Quindi sarebbe bello se qualcuno potesse darmi un consiglio su cosa altro testare o dove impostare i breakpoint in .net per trovare la causa principale. O ancora meglio trovare una soluzione/soluzione alternativa.

UPDATE:

ho scoperto che posso riprodotto il fenomeno anche se il puntatore del mouse è solo allontanato dalla finestra dell'applicazione (almeno sulle nostre piattaforme). E la probabilità che il bug si verifichi sembra aumentare con la complessità dell'interfaccia utente: la mia app di test non sempre non riconosce il clic, ma una app WPF complessa non riesce ogni volta.

Si dovrebbe essere in grado di riprodurre con il Developer Studio WPF (ad esempio, la versione 2013) in Windows 8.1 con un dispositivo touch:

  • hanno lo studio di sviluppo aperto per coprire solo la metà del touch screen
  • spostare lo spostamento in modo che il cursore punti all'area del desktop
  • toccare un pulsante (ad esempio "avvio debug" - il pulsante di riproduzione): nel mio caso il primo tocco non causa mai un evento click.

risposta

0

È risultato essere un ERRORE in WPF. È disponibile una soluzione alternativa finché non viene rilasciato un KB.

Per risolvere il problema, chiamare Mouse.Synchronize(); nel gestore di eventi PreviewTouchDown dell'UIElement di MainWindow interessato.

L'ho provato e funziona perfettamente.

+0

hotfix di Microsoft sono già disponibili: http://support2.microsoft.com/hotfix/KBHotfix.aspx?kbnum=3064706 http://support2.microsoft.com/hotfix/KBHotfix.aspx?kbnum=3064711 http://support2.microsoft.com/hotfix/KBHotfix.aspx?kbnum=3064715 – user2177774

+0

I collegamenti MS sono danneggiati. –

+0

No, l'ho provato (22-Jul-2016) e sta funzionando bene. – user2177774

Problemi correlati