用戶希望我們做的應用程序不僅要控制另一個buy-in進來的系統,還要將這個buy-in進來的系統運行的結果(比如檢測畫面)自動截取并形成檢測報告存起來,以后想要就可以找到。
這個要求合理,但挺過份。因為buy-in系統的檢測結果是不容易抓到的。好在以前有AutoKey的概念,最初的解決方案就是激好buy-in系統,然后發送CTRL+Print Scr組合鍵將當前應用系統作屏幕硬copy. 但是效果不好,用戶不接受,原因是用戶只想要檢測結果畫面,不想要什么tool bar和Tree view, 也就是說他們只想要這個系統畫面中的一部分。
也行,那就是將整個系統畫面存入內存,在按坐標截取用戶想要的那部分不就得了。但這個方法也不好,因為他要隨屏幕分辨率的不同,要在安裝的機器上測試過才可以正常運行,一旦換一台機器或分辨率變了,就不能正確截取。
好,看來只能用絕招了。就是獲得buy-in系統中承載這個檢測結果的control, 然后得到它在Parent中的坐標,經計算得出左上角的坐標,然后再用image copy的辦法截取
計算沒有什么可說的,獲得子control的坐標也沒有什么,但是值得關注的是C#中的內存分配。可以有几種方法,用Marshal.AllocCoTaskMem也行,用unsafe也行,用GCHandle.Alloc也可。unsafe當然不好,因為內存管理不在framework中,但是速度最快。GCHandle.Alloc是比較標准的做法,由于C#的內存管理是動態的,所以必須用GCHandle一組函數才能完成操作,而且比較慢.Marshal.AllocCoTaskMem是用WinAPI的方式,速度也可,方法也值得借鑒
代碼:SourceCode