問題描述
表象
拾取元素時出現“穿透”,通過 WindowsAPI 拾取目標控制元件元素資訊時,滑鼠拾取元素的同時還執行了目標控制元件上的操作,這種情況是不允許的,(PS:通過單擊進行拾取,常規情況下已做了屏蔽,不會執行目標控制元件的操作)
里象
經過分析和測驗,得出結論,誤操作的控制元件系結的不是 Click事件 而是 MouseUp事件
分析屏蔽操作漏洞
分析屏蔽操作
在正確捕獲到目標元素后會取消 CallNextHookEx事件 的執行,從而達到單擊時屏蔽目標控制元件操作的目的,
分析捕獲操作
目的是為了捕獲“單擊操作”,但 WindowsApi 只有 MouseDown 和 MouseUp事件,于是將兩次都算作單擊事件,并做了些許優化,即兩次事件的間隔時間小于200ms則第二次事件執行時直接 return,
分析目標控制元件執行原因
對于系結了 Click事件 的控制元件在第二次捕獲操作后直接return, CallNextHookEx 檢測不到完整的Click操作直接等于屏蔽效果,
對于系結了 MouseUp事件 的控制元件在第二次捕獲后直接return, CallNextHookEx 剛好可以檢測到MouseUp事件就繼續執行,
順著此思路,第二次捕獲后 return 時取消 CallNextHookEx事件 即可,
小插曲
覺得別人的想法有點“畫蛇添足”,畢竟先捕獲兩次在屏蔽一次還出了問題,就想進行優化,換一種思路,若嘗試只捕獲一次,是否就不存在此問題?
第一次嘗試理解出錯,捕獲了 MouseDown事件,以為會屏蔽 MouseUp事件,結果沒捕獲 MouseUp事件 導致目標控制元件的 MouseUp事件 直接執行了,
反過來捕獲 MouseUp 就可以了,
為什么說我是小丑呢?
一開始覺得我這種寫法還挺好,結果存在巨大的漏洞,即目標控制元件系結了MouseDown事件我這種方式又會出現“穿透”,別人的寫法雖然冗余但不存在此問題,
其他
初學時還有另一種想法:即都不執行 CallNextHookEx 事件會怎樣,結果滑鼠移動事件都無法觸發,導致滑鼠無法移動
單一捕獲判斷條件
if (wParam == WM_LBUTTONDOWN) if (wParam == WM_LBUTTONUP) 滑鼠移動512 ox200 滑鼠按下513 0x201 滑鼠彈起514 0x202 WM_LBUTTONDOWN 滑鼠按下 WM_LBUTTONUP 滑鼠彈起捕獲條件
捕獲
MouseHookProc(int nCode, int wParam, IntPtr lParam)
CallNextHookEx
int CallNextHookEx( int idHook, int nCode, int wParam, IntPtr lParam)
測驗程序
測驗用例:創建一個含三種事件的Java應用和C#應用(問題暴露在一個Java應用上,平常處理Windows平臺的應用較多)
- 推測一:兩種應用分別來測驗,究竟與平臺是否相關聯,通過測驗發現與平臺關聯性不大
- 推測二:是否和Web端的事件冒泡類似,通過一些測驗發現二者并不想通
- 推測三:控制元件注冊的事件不一樣,通過按住滑鼠不放,能夠捕獲且不觸發事件,大致推測與系結的事件相關
- 推測四:我點在了哪里?應用還是遮蓋層,程式原本設計的有遮蓋層,算是干擾項,通過質詢同事了解到我們并沒有點在遮蓋層上,
由于一開始不知道系統是如何屏蔽原目標控制元件事件的,給問題分析帶來很大的難度
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/251281.html
標籤:C#
上一篇:工廠模式中的泛型介面
下一篇:NVelocity實作代碼生成
