2009-09-09 27 views
3

我會如何將文本放置在Windows桌面上?我被告知GetDesktopWindow()是我需要的,但我需要一個例子。如何在Windows桌面上繪製文字?

+0

你爲什麼要這麼做?是否還沒有內置於Windows中的通知系統,您可以使用,而不是將文本寫入桌面窗口?提示:可能有。 – Pod 2009-09-09 23:08:35

+0

我想製作一些類似Windows的工具條。主要是作爲一個學習的經驗,但我認爲這將是有益的,以及... – sowas 2009-09-10 14:19:59

回答

3

This question might help you。這與你在這裏提出的問題大致相同,並提供了一個完整的例子來說明如何去做。

+0

我已經試過了與取代的TextOut並和它的書面和只是其中的一部分顯示 – sowas 2009-09-09 12:30:21

+0

錯誤我的壞,它只是儘快刪除。它確實做了我所說的,但是我希望文本在窗口移動之後仍然保留。 – sowas 2009-09-09 12:38:24

+1

@sowas:這將很難完成。移動時,Windows傾向於重新繪製屏幕上的所有內容。當窗口移動時,您需要重寫自己的文本。我會盡力找到一種方法來做到這一點。 – Kredns 2009-09-09 17:25:15

9

我假設您的最終目標是在桌面上顯示某種狀態信息。

你將不得不採取任:

  • 注入DLL資源管理器中的進程和子類的桌面窗口(SysListView32Progman窗口的層次結構的底部)來繪製你的文字直接在其上。

  • 創建一個不可激活的窗口,其背景使用PaintDesktop繪製並在其上繪製文本。

第一個解決方案是最具侵入性,且很難編碼,所以我不會推薦它。

第二種解決方案允許最大的靈活性。沒有「無證件」或依賴於Explorer的特定實現,甚至只是將Explorer作爲shell。

爲了防止點擊時窗口被置頂,可以在Windows 2000及更高版本上使用擴展窗口樣式WS_EX_NOACTIVATE。在低級系統上,您可以處理WM_MOUSEACTIVATE消息並返回MA_NOACTIVATE

如果您需要通過使用分層窗口來實現真正的透明度,則可以使用PaintDesktop調用,但概念保持不變。我寫了另一個答案,詳細說明如何使用GDI +正確地使用alpha來完成分層窗口。

1

爲什麼不只是在桌面壁紙圖像文件中繪製文本?

如果您不必經常更新信息並且您有壁紙圖像,則此解決方案將可行。

人們可以很容易地使用CImage類加載壁紙圖片,CImage::GetDC()獲得設備上下文繪製成,然後保存新的圖像,最後更新桌面壁紙的新形象。

+0

我已經想到了,但數據必須經常更新。 – sowas 2009-09-10 14:17:16

0

我還沒有試過,但我相信你可以做到以下幾點:

  1. 使用GetDesktopWindow檢索桌面窗口的句柄
  2. 使用SetWindowLong函數的窗口消息處理程序指向你自己的程序
  3. 在你的過程中,處理WM_PAINT消息(或其他)並繪製你所需要的。
  4. 在您的proc中,調用原始消息處理程序(由SetWindowLong返回)。

不是100%確定它能工作,但看起來應該是這樣,因爲這是窗口子類的正常方法。

-don

+1

這將崩潰兩次:一次是在EXPLORER.EXE不能調用自己的程序(它在你的過程,而不是瀏覽器)。如果我們可以忽略它,當你嘗試在資源管理器的進程中調用原始的WndProc時,它會崩潰,而不是你的。 – MSalters 2009-09-15 15:28:08

0

如果你的目的是要產生類似的邊欄,你可能只是想創建一個或多個layered windows。這也將讓你處理鼠標點擊和輸入的其他正常來源,如果你提供的alpha通道信息,Windows將確保您的窗口在任何時候都正確繪製。如果你不希望窗口是互動的,用適當的方式(如WS_EX_NOACTIVATE)像少佐建議。