2010-05-06 79 views

回答

3

AFAIK沒有比您提到的更好的解決方案。當然,子類化窗口比鉤住線程的所有消息要好。

我們認爲,直到它通過窗口處理的消息通過了哪條路徑:

  1. 消息或者由OS張貼或發送到窗口,無論是通過顯式調用PostMessage/SendMessage或暗示。
  2. 只發布消息:最終線程從消息隊列中彈出此消息(通過調用GetMessage或類似的方法),然後調用DispatchMessage
  3. 操作系統調用窗口的過程,調用CallWindowProc(或類似的)。
  4. CallWindowProc標識與窗口相關聯的窗口procedore(經由GetClassLong/GetWindowLong
  5. 上述程序被調用。

子類化 - 意味着替換目標窗口的窗口過程。這似乎是最好的變體。 使用WH_GETMESSAGE標誌安裝掛鉤將監視發佈到消息隊列的所有消息。這是不好的,因爲以下原因:

  1. 性能原因。
  2. 你會得到通知只在特定線程
  3. 你會得到發佈的消息僅通知(發送的郵件將不可見)
  4. A「發佈」的消息並不一定意味着「創建的窗口交付」。也就是說,它可能會被消息循環過濾掉(不需要調用DispatchMessage)。
  5. 你不能看到實際的窗口做了什麼,並返回該消息。

因此,子類似乎好多了。

還有一個解決辦法 - 如果您的具體消息發佈(而不是發送),你可以重寫消息循環,併爲每一個檢索到的消息,你可能會做一些前/後處理

相關問題