我需要編寫一個screencast,並且需要檢測窗口內容何時發生變化,即使只選擇了文本。這個窗口是第三方控制。如何檢測窗口內容何時發生變化
2
A
回答
5
Ther're幾種方法。
(1)屏幕輪詢。
您可以查詢屏幕(即創建一個DIB,從屏幕到它的每個時間段BitBlt
),然後把它作爲-是
優點:
- 很簡單實施
缺點:
- 高CPU負載。每秒輪詢整個屏幕的次數非常繁重(應該傳輸大量數據)。因此它會很沉重並且很慢。
- 高網絡帶寬
(2)同上,除了現在你做的調查屏幕上看到的不同的一些分析。然後你可以只發送差異(如果沒有改變,顯然不發送任何東西),再加上你可以選擇壓縮差異流。
優點:
- 還沒太複雜,實現
- 顯着降低網絡帶寬
缺點:
- 甚至更高的CPU使用率。
(3)和上面一樣,不同之處在於您不會持續輪詢屏幕。相反,你可以爲你的控件做一些鉤子(比如監視控件收到的Windows消息)。然後你試着學習什麼時候你的控件應該重繪,並且只在這些場景中進行屏幕輪詢。
優點:
- 顯着降低CPU使用率
- 仍是可接受的網絡帶寬
缺點:
- 實施變得複雜。像注入鉤子等
- 由於這是基於一些啓發式 - 你不能保證(一般來說)涵蓋所有可能的情況。在某些情況下,您可能會錯過更改。
(4) 掛鉤處於較低級別:截取對繪圖函數的調用。由於用戶模式中有這麼多功能,因此唯一可行的方法是在內核模式下進行。
您可能寫一個虛擬視頻驅動器(無論是「鏡像」的視頻驅動程序,或鉤的現有的一個)接收所有圖中的系統。然後,無論何時您在特定區域收到圖紙請求 - 您都會知道它已更改。
優點:
- 降低CPU使用率。
- 保證100%攔截所有圖紙,沒有啓發式
- 有些清潔劑 - 無需注入鉤到應用程序/控制
缺點:
- 這是一個驅動程序開發!除非你有經驗 - 這真是一場噩夢。
- 更復雜的安裝。需要管理員權限,最有可能需要重啓。
- 仍然相當大的CPU負載和帶寬
(5) 事情與驅動程序的開發。只要您現在知道哪些繪圖功能被調用 - 您現在就可以切換策略。而不是「記住」骯髒的區域並輪詢屏幕 - 您可以「記住」用所有參數調用的繪圖函數,然後在主機端「重複」它。
通過這樣你就不必在所有輪詢屏幕。你使用「矢量」方法(而不是「柵格」)。
然而這實現起來要複雜得多。一些繪圖函數將另一個位圖作爲參數,而這些位圖又是使用另一個繪圖函數等繪製的。您必須窺探位圖和屏幕。
優點:
- 零CPU負荷
- 最佳的網絡流量
- 保證始終工作
缺點:
- 這是一個驅動程序開發處於最佳狀態!發展的幾個月保證
- 需要最先進的編程,深刻理解二維圖紙
- 需要在主機寫代碼,它將「繪製」所有「記錄」命令。
相關問題
- 1. 如何檢測,當一個元素的內容發生變化
- 2. 檢測PropertyChangedEventHandler何時發生變化
- 3. 如何檢測X11窗口的內容何時更改?
- 4. Javascript:如何檢測變量的引用何時發生變化
- 5. 用戶檢測窗口時間變化
- 6. Coffeescript:如何檢索元素內容後發生變化
- 7. 如何流化gnome窗口的內容
- 8. 當內容發生變化
- 9. PHP:檢測變量值何時發生變化
- 10. 如何在div內容發生變化時調用js函數
- 11. 如何使用wxPython檢測我的窗口何時最小化?
- 12. 檢測窗口文本變化與pinvoke
- 13. 檢測窗口外殼變化
- 14. 如何檢測窗口哈希的變化?
- 15. 如果窗口內容發生變化,自動截取x服務器
- 16. 變化WPF窗口的標籤內容
- 17. 如何檢測變量是否發生了變化?
- 18. 如何使方法檢測變量是否發生了變化?
- 19. 如果CKEditor的內容發生變化
- 20. 如何檢測內容何時加載?
- 21. 如何檢測當前的網址當發生任何變化
- 22. 檢測CControlBar的對接狀態何時發生變化
- 23. 當StackPanel的內容發生變化時,如何觸發一個觸發器?
- 24. 當我最小化窗口時,元素位置發生變化
- 25. 如何檢測「狀態」的變化並顯示一些內容?
- 26. 當窗口變小時CSS發生變化
- 27. 如何檢測元素的字體家族何時發生變化
- 28. 智能檢測html內容變化
- 29. 檢測ul列表內容變化jQuery
- 30. iOS - 檢測CALayer內容的變化
謝謝您的回答。對於我的任務第三種方法將接近(偵察窗口消息)。我知道wm_paint,但這還不夠。你可以通過這種方式發表更多評論嗎? – Schnider 2010-10-25 12:20:57
「WM_PAINT」還不夠,因爲控件可能會自己繪製,(它只會「GetDC」並繪製自己)。你還應該用'WM_COMMAND'來查看特定的情況。有時候也應該考慮鼠標消息。 – valdo 2010-10-25 12:56:08
這只是我嘗試了所有描述的場景。而且,我必須說,在「一般情況下」(未知的控制或應用程序) - 它不會可靠地工作。然而,特定的控制可以以這種方式完成。 – valdo 2010-10-25 12:57:14