ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2015年10月20日火曜日

Windows8 で壁紙を変更するプログラム(C#)

Windows7 から自作の壁紙チェンジャーを使ってるんだけど、Windows8 で動かなかった。

壁紙の変更には Win32API の

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, [ファイルパス], [フラグ])

これを使ってて、どう調べてみても Windows8 からこれが使えなくなったという話はない。

戻り値も正常だし、でも壁紙は変わらない。

で、なにが問題だったかというと、ファイルパス。

元々、カレントディレクトリにあるファイルを指定してたのでファイルパスのところにはファイル名だけを指定してたんだけど、Windows7 だとそれでいいのに、Windows8 だとカレントディレクトリにあるファイルでもフルパスで指定する必要があるみたい。

フルパスで指定したら動いたんで詳しくは調べてないんだけど、この辺、仕様が変わったりしたのかな?

Windows7 で動いてたのがむしろたまたまなのかもしれないけど。。

2013年8月12日月曜日

OleCreatePropertyFrame() を 64bit で使いたい

っていう必要がありまして、しばらく調べていました。

普通ですと、olepro32.dll を取り込んで使うわけですが、これはどうやら x64 をターゲットにすると、「そんな DLL ないよ?」というエラーになる。

調べていると、同じ症状が出て困っている方も多数。で、解決策としてあがっているのは、「ターゲットを x86 にすればいいよ」

って、そんなことはわかってるんですよ。ただ、他の DLL とかシステム全体とかのからみもあるんで、ターゲットは x64 のままにしとかなければならないんです。そんな場合の解決策が見つからない…

で、さらに調べていたら、oleaut32.dll っている DLL の中にも同名の関数 OleCreatePropertyFrame() があることがわかりまして、とりあえず使ってみました。

おっ、これは x64 でも動くじゃないですか。しかも、引数とか olepro32.dll のやつと同じ。検索するとよく見つかる、olepro32.dll の OleCreatePropertyFrame() を使う方法をそのままコピペって、olepro32.dll の部分を oleaut32.dll に書き換えるだけで使えた。

細かい違いとかがあるのかどうかはこれから調べるとして、とりあえず x64 でも OleCreatePropertyFrame() が動いたよ。っていうお話でした。