在 WPF 中可以通過 StylusPlugIn 的方式快速從觸摸線程拿到觸摸數據,而 WinForms 沒有這個機制,但是可以通過 Microsoft.Ink 組件和 WPF 相同在 RealTimeStylus 服務拿到觸摸點 ...
在 WPF 中可以通過 StylusPlugIn 的方式快速從觸摸線程拿到觸摸數據,而 WinForms 沒有這個機制,但是可以通過 Microsoft.Ink 組件和 WPF 相同在 RealTimeStylus 服務拿到觸摸點
本文的例子放在微軟的官方例子裡面,請看 GitHub 代碼
本文不會告訴大家代碼如何寫,因為看微軟的代碼就知道了,本文主要告訴大家為什麼這樣做的觸摸收集足夠快
在 Windows 裡面,會通過 WM_TOUCH
的消息發送觸摸的信息,但是通過消息的方式不夠快。當然這句話不是說消息不快,而是和 Wisptis 服務對比還是不夠快
從微軟的筆和觸摸服務裡面獲取的方法是需要使用複雜的方法才能獲取到內容,大概的獲取方法就是從共用記憶體裡面讀取值,此時的讀取速度將比消息快
在 csproj 裡面引用 Microsoft.Ink 組件,將可以獲取 RealTimeStylus 的封裝方法,不需要寫一個 PenImc 的組件。但是通過這個方法將拿到十分底層的內容,需要小伙伴自己處理
<Reference Include="Microsoft.ink, Version=6.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<SpecificVersion>True</SpecificVersion>
</Reference>
我推薦下載微軟的代碼,然後構建,嘗試運行,然後對比一下性能。這個方法能拿到最快的觸摸信息,但是這個方法優化的僅是觸摸收集,而對渲染沒有做多少優化
更多請看微軟文檔 Windows Touch Scratchpad using the Real-Time Stylus Sample (C#) - Win32 apps
在 WPF 中預設的 StylusPlugIn 就使用了這部分優化,不需要額外的引用組件,如何在 WPF 中做高性能筆請看 WPF 高性能筆
本文會經常更新,請閱讀原文: https://blog.lindexi.com/post/WinForms-%E4%B8%8B%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E7%AC%94%E8%BF%B9%E6%96%B9%E6%B3%95.html ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗