2010-10-25 84 views

回答

5

Ther're幾種方法。

(1)屏幕輪詢。

您可以查詢屏幕(即創建一個DIB,從屏幕到它的每個時間段BitBlt),然後把它作爲-是

優點:

  • 很簡單實施

缺點:

  • 高CPU負載。每秒輪詢整個屏幕的次數非常繁重(應該傳輸大量數據)。因此它會很沉重並且很慢。
  • 高網絡帶寬

(2)同上,除了現在你做的調查屏幕上看到的不同的一些分析。然後你可以只發送差異(如果沒有改變,顯然不發送任何東西),再加上你可以選擇壓縮差異流。

優點:

  • 還沒太複雜,實現
  • 顯着降低網絡帶寬

缺點:

  • 甚至更​​高的CPU使用率。

(3)和上面一樣,不同之處在於您不會持續輪詢屏幕。相反,你可以爲你的控件做一些鉤子(比如監視控件收到的Windows消息)。然後你試着學習什麼時候你的控件應該重繪,並且只在這些場景中進行屏幕輪詢。

優點:

  • 顯着降低CPU使用率
  • 仍是可接受的網絡帶寬

缺點:

  • 實施變得複雜。像注入鉤子等
  • 由於這是基於一些啓發式 - 你不能保證(一般來說)涵蓋所有可能的情況。在某些情況下,您可能會錯過更改。

(4) 掛鉤處於較低級別:截取對繪圖函數的調用。由於用戶模式中有這麼多功能,因此唯一可行的方法是在內核模式下進行。

您可能寫一個虛擬視頻驅動器(無論是「鏡像」的視頻驅動程序,或鉤的現有的一個)接收所有圖中的系統。然後,無論何時您在特定區域收到圖紙請求 - 您都會知道它已更改。

優點:

  • 降低CPU使用率。
  • 保證100%攔截所有圖紙,沒有啓發式
  • 有些清潔劑 - 無需注入鉤到應用程序/控制

缺點:

  • 這是一個驅動程序開發!除非你有經驗 - 這真是一場噩夢。
  • 更復雜的安裝。需要管理員權限,最有可能需要重啓。
  • 仍然相當大的CPU負載和帶寬

(5) 事情與驅動程序的開發。只要您現在知道哪些繪圖功能被調用 - 您現在就可以切換策略。而不是「記住」骯髒的區域並輪詢屏幕 - 您可以「記住」用所有參數調用的繪圖函數,然後在主機端「重複」它。

通過這樣你就不必在所有輪詢屏幕。你使用「矢量」方法(而不是「柵格」)。

然而這實現起來要複雜得多。一些繪圖函數將另一個位圖作爲參數,而這些位圖又是使用另一個繪圖函數等繪製的。您必須窺探位圖和屏幕。

優點:

  • 零CPU負荷
  • 最佳的網絡流量
  • 保證始終工作

缺點:

  • 這是一個驅動程序開發處於最佳狀態!發展的幾個月保證
  • 需要最先進的編程,深刻理解二維圖紙
  • 需要在主機寫代碼,它將「繪製」所有「記錄」命令。
+0

謝謝您的回答。對於我的任務第三種方法將接近(偵察窗口消息)。我知道wm_paint,但這還不夠。你可以通過這種方式發表更多評論嗎? – Schnider 2010-10-25 12:20:57

+0

「WM_PAINT」還不夠,因爲控件可能會自己繪製,(它只會「GetDC」並繪製自己)。你還應該用'WM_COMMAND'來查看特定的情況。有時候也應該考慮鼠標消息。 – valdo 2010-10-25 12:56:08

+0

這只是我嘗試了所有描述的場景。而且,我必須說,在「一般情況下」(未知的控制或應用程序) - 它不會可靠地工作。然而,特定的控制可以以這種方式完成。 – valdo 2010-10-25 12:57:14