簡體   English   中英

如何在Windows桌面上繪制文本?

[英]How to draw text on the desktop in Windows?

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

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

您將不得不這樣做:

  • 注入DLL資源管理器中的進程和子類的桌面窗口( SysListView32在底部Progman窗口的層次)繪制直接在文本到它。

  • 創建一個PaintDesktop窗口,其背景使用PaintDesktop繪制並在其上繪制文本。

第一種解決方案是最具侵入性的,而且很難編碼,因此我不推薦它。

第二種解決方案允許最靈活。 沒有“未記錄”或依賴於Explorer的特定實現,甚至只是將Explorer作為shell。

為了防止窗口在單擊時被置於頂部,您可以在Windows 2000及更高版本上使用擴展窗口樣式WS_EX_NOACTIVATE 在下層系統中,您可以處理WM_MOUSEACTIVATE消息並返回MA_NOACTIVATE

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

為什么不在桌面壁紙圖像文件中繪制文字?

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

可以輕松使用CImage類加載壁紙圖像, CImage :: GetDC()獲取要繪制的設備上下文,然后保存新圖像,最后將桌面壁紙更新為新圖像。

我沒試過,但我認為你可以做到以下幾點:

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

不是100%肯定它會工作,但似乎應該這樣,因為這是子窗口的正常方式。

-don

如果您的目的是生成側邊欄之類的東西,您可能只想創建一個或多個分層窗口 這也將允許您處理鼠標點擊和其他常規輸入源,如果您提供Alpha通道信息,Windows將確保您的窗口始終正確繪制。 如果您不希望窗口是交互式的,請使用適合的樣式(例如WS_EX_NOACTIVATE),如Koro建議的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM