关于修复弹窗被360弹窗拦截器拦截的问题的解决案例的分享
一、查找問題
收到反饋說編碼器被360彈窗攔截器攔截,經測試發現強力模式下也并沒有直接攔截,但是會出現提示框;猜測有可能是用戶不小心添加過濾了或者其他版本會有攔截,導致編碼器被關閉無法正確編碼。查找資源后發現,彈窗攔截是通過發送Windows消息觸發隱藏和關閉的。
于是考慮先把編碼器生成后接受到的消息打印出來查看分析。
由于WPF本身是有對消息和窗口句柄等進行封裝的,所以需要重新去添加using System.Windows.Interop; 這個namespace中所包含的東西主要是為 Windows Presentation Foundation (WPF) 和其他技術(如 Win32API)之間的互操作提供支持類型,并為涉及 WPF 的其他特定互操作方案提供基類。在WPF中使用WindowProc,首先要獲得一個HWND句柄(一個IntPtr類型),然后通過創建一個HwndSource對象,再通過調用這個對象中的AddHook方法來添加WindowProc。其中HwndSource實現包含 WPF 內容的 Win32 窗口。WPF 內容在此窗口中排列、度量、呈現,并且可交互式輸入。HwndSource 類設計用于一般的交互操作,而不是設計用作托管 HWND 包裝。通常,它不會提供操作窗口的托管方法或檢測其狀態的屬性。相反,HwndSource類提供通過 Handle 屬性對 Win32 窗口句柄 (HWND) 的訪問,可通過 PInvoke 技術將其傳遞到 Win32 APIs 以操作該窗口。
現在開始進行掛鉤,可以通過添加SourceInitialized的事件處理函數引發添加,直接重載OnSourceInitialized函數來添加。下面是通過添加處理函數的方式實現。
此外也有兩種獲取HwndSource的方法
上面為將窗口作為互操作方案的源生成HwndSource。
下面則通過WindowInteropHelper獲取窗口句柄,通過句柄來生成。然后通過掛鉤上消息處理函數自定義的WndProc。對于WinForm可以直接重載WndProc函數protected override void WndProc(ref Message m) 然后在窗體顯示時Shown添加過濾即可。WPF中再添加窗口內容呈現的處理函數進行過濾把窗口創建呈現之后產生的消息打印到桌面。
protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)前四個參數跟MSG結構體的意義一致,最后一個handled則代表這個消息是否告訴系統已經處理結束,是否需要繼續放行傳遞讓其他的方法執行。
大致生成了如下消息,通過攔截與不攔截、生成窗口后再添加攔截等測試,經分析,主要是自定義消息49642以及
WM_SHOWWINDOW = 24 (0x0018)當隱藏或顯示窗口是發送此消息給這個窗口
WM_CLOSE = 16(0x0010) 當一個窗口或應用程序要關閉時發送一個信號的問題。
二、驗證方法
經過對已攔截的消息的分析,先對已知的消息進行相關測試。
結果:
能夠正常編碼生成文件,但是窗口消失。
結果:
無論是否更改handled的值告訴系統或者更改顯示窗體的方法,都無法在收到隱藏窗體消息的時候發出顯示窗體的消息重新顯示窗體。
結果:
通過外部程序發送顯示的消息WM_SHOWWINDOW(wParam = 0x000001)能夠正常顯示;
編輯此區域
接下來驗證是否是所調用的方法出現錯誤,把該函數以及參數新建到一個控制臺程序在窗體隱藏時運行。
結果:
經測試發現可以把窗體喚醒顯示。因此初步判斷異常出現在接收到隱藏窗體消息時無法正確顯示。
4. 在WM_SHOWWINDOW(wParam = 0x000000)的執行過程中添加LogHelper記錄,通過對比相關消息發現,確實有進入執行該步驟,但卻無法顯示窗體,推測窗體處于要隱藏但尚未隱藏的狀態,即收到要隱藏的消息,但窗體的wParam還是等于1的,而且在WM_SHOWWINDOW(wParam = 0x000000)這個消息的處理中發出WM_SHOWWINDOW(wParam = 0x000001)消息有被微軟本身做出相關處理,不執行。
結果:
能夠正確在360彈窗攔截器隱藏窗口發出關閉消息后馬上顯示窗體,攔截次數從9次變成10次并且不會被再次隱藏。
此外,在使用外部軟件顯示窗體時,會被攔截器再次攔截,故把handled值改為False測試,發現在顯示之后還是會被攔截,推測是360彈窗攔截器有對消息做重復檢測,但通過handled=True告訴系統已經處理過,讓彈窗攔截器無法截獲該消息,認為窗體已經正確關閉。至此,已經解決360彈窗攔截的問題,以上就是我對修復該問題的分析流程。
總結
以上是生活随笔為你收集整理的关于修复弹窗被360弹窗拦截器拦截的问题的解决案例的分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做一个即时利润表仪表板(不用等账都做完核
- 下一篇: 光通信的最新技术趋势