示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
本文記錄 WPF 的已知問題,在 .NET Core 版本的 WPF 應用裡面,應用啟動的過程監聽 WMI 事件,將導致觸摸模塊 COM 介面獲取失敗,進而導致觸摸失效
此問題僅在 .NET Core 版本復現,在 .NET Framework 框架下能正常工作
復現步驟如下:
- 安裝 System.Management 庫用於使用 WqlEventQuery 監聽 WMI 變更
- 監聽 TouchDown 事件輸出斷點信息
復現代碼如下
public MainWindow()
{
InitializeComponent();
AppDomain.CurrentDomain.FirstChanceException += (sender, args) =>
{
Debug.WriteLine(args.Exception);
};
WqlEventQuery insertQuery =
new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
insertWatcher.Start(); // 如果註釋掉這句話,那 TouchDown 事件將會被觸發
TouchDown += MainWindow_TouchDown;
}
private void MainWindow_TouchDown(object? sender, TouchEventArgs e)
{
Debugger.Break(); // 不會被命中
}
加上 insertWatcher.Start()
這句代碼時,可以從 FirstChanceException 看到如下異常
System.InvalidCastException: 沒有註冊介面
at MS.Win32.Penimc.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
規避方法是不要在軟體啟動的時候立刻調用 WMI 組件,如讓 ManagementEventWatcher 延遲幾秒執行
此問題已經報告給 WPF 官方,請看 https://github.com/dotnet/wpf/issues/9752
本文代碼放在 github 和 gitee 上,可以使用如下命令行拉取代碼。我整個代碼倉庫比較龐大,使用以下命令行可以進行部分拉取,拉取速度比較快
先創建一個空文件夾,接著使用命令行 cd 命令進入此空文件夾,在命令行裡面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 308096e0c8ede019f6dbe5bfe974ae1a12d7de42
以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令行繼續輸入以下代碼,將 gitee 源換成 github 源進行拉取代碼。如果依然拉取不到代碼,可以發郵件向我要代碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 308096e0c8ede019f6dbe5bfe974ae1a12d7de42
獲取代碼之後,進入 WPFDemo/YanerehaylemJeekalhebel 文件夾,即可獲取到源代碼
更多技術博客,請參閱 博客導航
博客園博客只做備份,博客發佈就不再更新,如果想看最新博客,請訪問 https://blog.lindexi.com/
如圖片看不見,請在瀏覽器開啟不安全http內容相容
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含鏈接:https://www.cnblogs.com/lindexi ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我[聯繫](mailto:[email protected])。