DOBON.NET DOBON.NETプログラミング掲示板過去ログ

デスクトップに直接描画したい

環境/言語:[XP Professional / VB 2008 Express Edition]
分類:[.NET]

【解決したい問題】

以前使っていたフリーソフトで「デスクトップ(正確には「アイコンの後ろ・壁紙の前」っぽい)に直接描画するから、常駐する必要が無い」カレンダーソフトがあって感心した記憶があり、ちょっと真似してスケジューラ的なものでも作ろうかと思ったまでは良かったのですが、

VB .NET環境で「デスクトップ領域に直接(不可視のコントロールからコピーしても無問題ですが)文字・図形を書き込む」のには、BilbltあたりのAPIでも呼び出すのでしょうか?

また、描画領域(デスクトップ)の指定方法(名称・所属クラス等々)もさっぱり見当が付かない、という状況です。

ご存知の方がいたら、ご教授頂ければ幸いです。


#需要が無いのか、「.NET」「デスクトップ」「直接」「描画」「API」等々のキーワードでgoogle先生にお伺いを立てても、「アイコン描画」はあるんだけど文字・図形描画っぽい記述は見つからず orz
■No25167に返信(レゲーフリークさんの記事)
>「デスクトップ(正確には「アイコンの後ろ・壁紙の前」っぽい)に直接描画するから、常駐する必要が無い」カレンダーソフトがあって感心した

そのソフトがどれかは分かりませんが、実際には「現在の壁紙の上にカレンダーを描画した画像を、新しい壁紙として設定する」動作をしているのではないでしょうか?


> VB .NET環境で「デスクトップ領域に直接(不可視のコントロールからコピーしても無問題ですが)文字・図形を書き込む」のには、BilbltあたりのAPIでも呼び出すのでしょうか?
> また、描画領域(デスクトップ)の指定方法(名称・所属クラス等々)もさっぱり見当が付かない、という状況です。

何らかの手段でデスクトップに描画できたとしても、ウィンドウを重ねたり、壁紙を変えたり、何らかの更新が走ったりするだけで、消えてしまいます。


今の方針だと、苦労するけれども実りが少ないと予想されるため、アプローチを見直して見ることを提案します。
(前述のように壁紙にするとか)
■No25168に返信(Azuleanさんの記事)
> そのソフトがどれかは分かりませんが、実際には「現在の壁紙の上にカレンダーを描画した画像を、新しい壁紙として設定する」動作をしているのではないでしょうか?
>

えーっと、旧PC引っ張り出してそのソフトのreadme漁ってきました。

しののん氏の「デスクトップカレンダー(ver.1.52)」です。
ttp://members.jcom.home.ne.jp/shinonon/
(直リンクが問題出るか判らないので、h抜きで)

てっきり2K以降動かないかなと思って放置してたら、見事にXPでも動きましたw
でも、VistaのAeroとかでは多分動かないでしょう。

ただ……開発言語はDelphi5Jだそうです。

>
> 何らかの手段でデスクトップに描画できたとしても、ウィンドウを重ねたり、壁紙を変えたり、何らかの更新が走ったりするだけで、消えてしまいます。
>

確かに、壁紙更新時やスリープモードからの復帰時には消えてしまいますが、ウィンドウ重なった程度では消えてないのですよ……。
また、デスクトップで右クリックメニューで「アイコンの整列>デスクトップ アイコンの表示」で、アイコンと一緒に消えたり出たり(※「書き換えた壁紙に差し替えている」のは無いと思われます)。
さらには、アイコンを描画されたカレンダの上に移動させて、再度移動させても文字が欠けるとかいう事は無いのです。

……Windows自体がそういう描画領域(レイヤー?)を持っているんじゃないかな?と思っていたのですが。


開発言語が違うかもしれませんが、最終的にAPIとかOSレベルに帰属する以上、同じことができるんじゃないのかな?と思っているので、質問は取り下げず継続させていただきます。ご了承ください。


#まぁ、昔みたいにリソースカツカツなんて事の無い今更、常駐アプリが1個増えたからなんだ。と言われればそれまでなんですが……。
■No25169に返信(レゲーフリークさんの記事)
> しののん氏の「デスクトップカレンダー(ver.1.52)」です。
> ttp://members.jcom.home.ne.jp/shinonon/
> (直リンクが問題出るか判らないので、h抜きで)
(略)
> (※「書き換えた壁紙に差し替えている」のは無いと思われます)。

「思う」とのことですので、実際に確認しました。
該当のソフトをダウンロードして、「描画」ボタンを押すと、壁紙が変わっています。(deskcal という名前の壁紙)

XP での確認方法ですが、デスクトップを右クリックしてプロパティを選択することで画面のプロパティを開き、デスクトップタブの内容を確認しています。
描画を実行する前と後で壁紙が変わっていることを確認できるはずです。
Vista では確認方法が異なりますが、手順は省略させて下さい。

> でも、VistaのAeroとかでは多分動かないでしょう。
壁紙を置き換えるだけなので、Aero の影響はないでしょう。


> 確かに、壁紙更新時やスリープモードからの復帰時には消えてしまいますが、ウィンドウ重なった程度では消えてないのですよ……。
これは壁紙を置き換える仕組みであれば消えません。
元の「デスクトップへの直接描画」を実際に行った場合は、再描画しない限り、他のウィンドウと同じように重なった段階で消えることをお伝えしたかったのです。
2009/08/09(Sun) 20:55:12 編集(投稿者)

(Azleanさんのを一言補足すると…設定作業中はその設定になっていますが、確定終了すると設定の方からは消えて設定自体は元に戻ります。画面はセッション内では維持されています。)


設定内容は保存せずに、でも背景変更だけは維持しているという動作のものと言えば、以下が同じような動作をすると思います。

Imports System.Runtime.InteropServices

Public Class Form1


    Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _
       (ByVal uiAction As System.UInt32, _
     ByVal uiParam As System.UInt32, _
     <MarshalAs(UnmanagedType.LPStr)> ByVal lpvParam As String, _
     ByVal fWinIni As System.UInt32) As UInt32
    Const SPI_SETDESKWALLPAPER As UInt32 = 20
    Const fWinIni As Long = 0 '一時変更なので0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '背景にしたい画像を何らかの手段で用意してから、そのパスを指定
        Dim aaa As String = "C:\test.bmp"
        '保存なしモードで背景を切り替え
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, aaa, fWinIni)
    End Sub
End Class


なお、指定するファイルパスの長さに制限があったような気がしますが、ちょっと忘れました。
>
> 「思う」とのことですので、実際に確認しました。
> 該当のソフトをダウンロードして、「描画」ボタンを押すと、壁紙が変わっています。(deskcal という名前の壁紙)
>
> XP での確認方法ですが、デスクトップを右クリックしてプロパティを選択することで画面のプロパティを開き、デスクトップタブの内容を確認しています。
> 描画を実行する前と後で壁紙が変わっていることを確認できるはずです。
> Vista では確認方法が異なりますが、手順は省略させて下さい。
>

当方の環境では壁紙が「(なし)」だったので変化が無く、気付きませんでした。
確かに適当な壁紙当ててやると、名称こそ出ていないもののプレビューが真っ黒に潰れています。

きっと「設定上の壁紙は変えていないんだけど、今の壁紙は差し変わったもの」なのだろう。ということは推測できるのですが。

とりあえず、「デフォルトの壁紙キャプチャ」>「描画したい文字・図形を合成」>「合成した画像を壁紙として表示」で同じ事ができそうですので、試行錯誤してみます。

> これは壁紙を置き換える仕組みであれば消えません。

ただ、「アイコンの表示/非表示」で消えたり再描画されたりする。という謎は残っていますが……。
(壁紙なら、何故アイコンと一緒に消えるのだろう……)

> 元の「デスクトップへの直接描画」を実際に行った場合は、再描画しない限り、他のウィンドウと同じように重なった段階で消えることをお伝えしたかったのです。

当方の読解力足らずで、度々ご迷惑をおかけして申し訳ありませんでした。
「デスクトップに直接描画」ではなく「壁紙を合成して差し替える」アプローチで検討します。

失礼しました。
解決済み!
■No25171に返信(こど。さんの記事)
> (Azleanさんのを一言補足すると…設定作業中はその設定になっていますが、確定終了すると設定の方からは消えて設定自体は元に戻ります。画面はセッション内では維持されています。)
確かにツール自体を終了すると設定自体は元に戻っていますね。
確認不足で失礼しました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板