壁紙の変更で?

解決


マグ  2004-11-09 02:14:28  No: 117447

VBのプログラムから壁紙を変更するプログラムで
レジストリ操作を一切行わずに、
壁紙を変更させることが可能でしょうか?

レジストリをいじって変更するのは検索にかかったのですが、
いじらずに、変更する方法は検索にかかっていません。

知っている方がいるのならば、教えてください。

また、それが不可能な場合、出来ないということも教えてください。
初心者なので、記述方法が分かりません。

あと、レジストリ操作をなるべく、やりたくない理由は
レジストリをいじるのが怖いですから・・・・・(笑

環境:VB.NET + WindowsXP


ミッション  2004-11-09 02:33:56  No: 117448

WinAPI
GetDesktopWindowでデスクトップのハンドル取得
GetDCでデバイスコンテキスト取得
BitBltでなど描画関数で描画
なんて方法もありかと思います。

VB.NETはもってないのでわかりません。


raki  URL  2004-11-09 02:43:56  No: 117449

APIのSystemParametersInfoを調べてください。

但し、このAPIはBitmapしか受け付けませんので、
Bitmap以外を設定したい場合はイメージの変換が必要になります。
が、.NETでは簡単に行えるので、問題ないでしょう。


魔界の仮面弁士  2004-11-09 05:27:36  No: 117450

BMP以外(JPEGなど)のファイルを指定したい場合には、
IActiveDesktopインターフェイスのSetWallpaperメソッドを使います。


マグ  2004-11-09 18:12:35  No: 117451

>WinAPI
>GetDesktopWindowでデスクトップのハンドル取得
>GetDCでデバイスコンテキスト取得
>BitBltでなど描画関数で描画
>なんて方法もありかと思います。

>VB.NETはもってないのでわかりません。

GetDesktopWindowでハンドルを取得できて、BitBltで描画できても、
GetDCの使い方がわかりません(TT)
しかも、GetDCって取得した画像データの破棄もしなければ、いけなかったような
記憶が・・・・・

もわかりません。
私はそこまで、知識がありません(TT)

>rakiさんと魔界の仮面弁士さん

検索をかけてみましたら、
http://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips012.html
がかかりましたけど、

' レジストリの値を変更

        Dim regkeyDesktop As RegistryKey

        ' HKEY_CURRENT_USER\Control Panel\Desktopを開く
        regkeyDesktop = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)

上のリンクのソースで一部でこれはレジストリ操作をしているような気が
するのですけど、
方法はこれしかないでしょうか?


raki  URL  2004-11-09 22:29:31  No: 117452

そのソースは壁紙の表示方法を
『中央に表示』『並べて表示』『拡大して表示』
のいずれかに変更する場合にレジストリ操作をしています。

逆に言えば、これを変更する必要が無ければ
レジストリ操作は必要ないということです。

> 方法はこれしかないでしょうか?

魔界の仮面弁士さんのレスをお読みになりましたか?


マグ  2004-11-10 00:06:24  No: 117453

>そのソースは壁紙の表示方法を
>『中央に表示』『並べて表示』『拡大して表示』
>のいずれかに変更する場合にレジストリ操作をしています。

ありがとうございました。

>魔界の仮面弁士さんのレスをお読みになりましたか?

読みました。

上のリンクは魔界の仮面弁士さんのレスをつけた文章の一部をキーワード検索で
探したんです。

壁紙を変更するぐらいならレジストリ操作を使用しないことがわかったので、
解決しました。

ソースの方は後に試して見ます。
今、学校の授業中ですし・・・・・・(汗


魔界の仮面弁士  2004-11-10 00:26:57  No: 117454

> そのソースは壁紙の表示方法を
> 『中央に表示』『並べて表示』『拡大して表示』
> のいずれかに変更する場合にレジストリ操作をしています。
> 逆に言えば、これを変更する必要が無ければ
> レジストリ操作は必要ないということです。

IActiveDesktopのSetWallpaperOptionsメソッドを使えば、
壁紙の位置の変更も可能です。

(使用する定数は、WPSTYLE_CENTER / WPSTYLE_TILE / WPSTYLE_STRETCH )


raki  URL  2004-11-10 00:50:04  No: 117455

> IActiveDesktopのSetWallpaperOptionsメソッドを使えば、
> 壁紙の位置の変更も可能です。

なるほど。
IActiveDesktopインターフェイスについてもう少し調べてみます。

インターフェイスについて質問があるのですが、
IActiveDesktopインターフェースをはじめ、
IShellFolder、IEnumIDListやIContextMenuなどのインターフェイスを
使用するときにも、やはり
  <ComImport(), _
  Guid("F490EB00-1240-11D1-9888-006097DEACF9"), _
  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
  Public Interface IActiveDesktop
    ・・・・
  End Interface
といった記述をしなければいけないのでしょうか。
Declare〜など、より短く簡単に記述することはできないのでしょうか?


魔界の仮面弁士  2004-11-10 01:47:48  No: 117456

COMを利用する場合は、そのような記述になりますね。
microsoft.public.dotnet.framework.interop に C♯なサンプルがあります。
http://www.dotnet247.com/247reference/msgs/41/205722.aspx

より手軽に利用するためには、タイプライブラリを使えばOKです。
SDKのみによる開発であれば、tlbimp.exe で変換できます。
(Visual Studio等をお持ちなら、タイプライブラリを参照設定するだけ)

なお、IActiveDesktop用のタイプライブラリは、標準では用意されて
いませんので、SDKを元に自分でコンパイルして作成するか、
Eduardo A. Morcilloさんが公開しておられるような、フリーの
タイプラリブラリを利用する事になるかと思います。


raki  URL  2004-11-10 11:18:15  No: 117457

以前VB.NETで『デスクトップ』をルートにした
エクスプローラ風ツリービューを作りたいと思いまして、
タイプライブラリを使ったVB6のサンプルを眺めつつ、
VB.NETに移植できないものかと試行錯誤しておりましたが、
なかなかうまくいかず・・・
もしVB.NETでのサンプル等をご存知でしたら教えていただけないでしょうか。

> SDKを元に自分でコンパイルして作成するか
これはCOMのSDKを元に、ということですか?
また、そういったもの(SDK)は割と公開されているものなのでしょうか。

参考にしたサンプルとタイプライブラリ
VB6でのエクスプローラツリーで使用しているタイプライブラリ
http://www.vbaccelerator.com/home/VB/Type_Libraries/IShellFolder/IShellFolder_Type_Library.asp
VB6でのエクスプローラツリーのサンプル
http://www.mvps.org/btmtz/vbexplorer/


魔界の仮面弁士  2004-11-10 18:19:53  No: 117458

[解決]済みのスレッドのはずなのに、投稿数が伸びていってますね。(^_^;)

> なかなかうまくいかず・・・
どこまで出来て、どこで躓いているのでしょうか?

> 以前VB.NETで『デスクトップ』をルートにした
> エクスプローラ風ツリービューを作りたいと思いまして、
googleで『treeview desktop ("VB.NET" OR "C#")』を検索したところ、
1件目に下記が来ました。参考になりませんか?

[The Code Project - Enhanced BrowseForFolder styled TreeView]
http://www.codeproject.com/cs/miscctrl/treeviewexplorer.asp

> これはCOMのSDKを元に、ということですか?
Platform SDKはお持ちですよね。その中に、
h/idl等が存在しているでしょうから、それらを利用して、
タイプライブラリを作成する、という意図の発言です。

もちろん、各インターフェイスのメソッドの定義を調べて、
自分でodl等を一から作る事もできますけど、それだと、
>  <ComImport(), _
>  Guid("F490EB00-1240-11D1-9888-006097DEACF9"), _
>  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
>  Public Interface IActiveDesktop
という手法と大差無いので、手間の軽減にはならないでしょうし。


raki  URL  2004-11-10 18:56:59  No: 117459

> [解決]済みのスレッドのはずなのに、投稿数が伸びていってますね。(^_^;)
大変申し訳ありません。別スレッドを立てるべきでした。

> どこまで出来て、どこで躓いているのでしょうか?
大変失礼致しました。
上手く説明できませんが、
アイテムIDリストを取得した後、個々に切り分けたり、
必要な部分のみコピーしたりといった操作が出来ていません。
サンプルではMoveMemoryやFillMemoryといったAPIを多用している為、
なかなか簡単には移植できず。ただ、アイテムIDリスト等、
かなり勉強にはなったので無駄ではなかったと思いたいです。
もう一度自力で頑張ってみます。

> googleで『treeview desktop ("VB.NET" OR "C#")』を検索したところ、
> 1件目に下記が来ました。参考になりませんか?
ありがとうございます。
私が半年前、これに挑戦していたときには見つけられなかったページです。
早速参考にさせていただきます。
The Code Projectのサイトも探したのですが、探し方が甘かったのか、
まだ無かっただけなのか。しかし、これでまた前へ進めそうです。

> Platform SDKはお持ちですよね。その中に、
> h/idl等が存在しているでしょうから、それらを利用して、
> タイプライブラリを作成する、という意図の発言です。
こちらについても調べてみます。
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加