windowsで最背面表示
windowsで最背面表示
WinAPIとDxLibで、デスクトップの壁紙のようなものを作っています。
ウィンドウは透明化、ツールバー非表示など主な設定はできました。
しかし、「デスクトップを表示」および「Windowsキー+Dキー」でデスクトップを表示させる時に、一緒に消えてしまいます。これについて色々調べた結果、Program Manager、Aero有効時だとWorkWに子ウィンドウとして設定する方法があるらしいのですが、あまり良い方法ではありませんし、もし配布するとなると相手側のPCで何が起こるか保証できないので、別の方法を探しています。
一応自分なりに考えてみて、定期的にHWND_BOTTOMを使って最背面にし、同時にアクティブ化をして消されても良いようにしてみたのですが、やっぱりうまくいきませんでした。
何かいい方法はありますでしょうか?
C言語
VC++2010
Windows 7
ウィンドウは透明化、ツールバー非表示など主な設定はできました。
しかし、「デスクトップを表示」および「Windowsキー+Dキー」でデスクトップを表示させる時に、一緒に消えてしまいます。これについて色々調べた結果、Program Manager、Aero有効時だとWorkWに子ウィンドウとして設定する方法があるらしいのですが、あまり良い方法ではありませんし、もし配布するとなると相手側のPCで何が起こるか保証できないので、別の方法を探しています。
一応自分なりに考えてみて、定期的にHWND_BOTTOMを使って最背面にし、同時にアクティブ化をして消されても良いようにしてみたのですが、やっぱりうまくいきませんでした。
何かいい方法はありますでしょうか?
C言語
VC++2010
Windows 7
Dango San
Re: windowsで最背面表示
すでに試してたならすみません。VB、C#だけどVC++に置き換えることはできるっしょ
[VB、C#]フォームの最大化、最小化、元のサイズに戻すをキャンセルする
※デスクトップを表示/Windows+Dで何が起こっているのかというと、すべてのウィンドウに対して最小化メッセージを出してるからです。それを無効にしてはどうかということ。
[VB、C#]フォームの最大化、最小化、元のサイズに戻すをキャンセルする
※デスクトップを表示/Windows+Dで何が起こっているのかというと、すべてのウィンドウに対して最小化メッセージを出してるからです。それを無効にしてはどうかということ。
written by へにっくす
Re: windowsで最背面表示
return trueはダメですね。下記のリンクによると、処理した場合は0を返すとありますよ。
それ以外は処理してないってシステムに言うことになるので、デフォルトの動作をすることになりますよ。
また、wParamをそのまま判定してはいけませんよ。下4ビットを無視するようにしないといけません。
下記のリンクをよーく読んで、修正してください。
WM_SYSCOMMAND
それ以外は処理してないってシステムに言うことになるので、デフォルトの動作をすることになりますよ。
また、wParamをそのまま判定してはいけませんよ。下4ビットを無視するようにしないといけません。
下記のリンクをよーく読んで、修正してください。
WM_SYSCOMMAND
written by へにっくす
Re: windowsで最背面表示
int type = wParam & 0xFFF0;
switch( msg )
{
case WM_SYSCOMMAND:
switch ( type )
{
case SC_MINIMIZE:
return 0;
}
break;
・
・
ただデスクトップ表示では依然消えてしまいます。
Dango San
Re: windowsで最背面表示
WM_SYSCOMMANDは、ユーザー操作やシステムからの事前通知的なメッセージです。
へにっくすさんのリンクされた先にもちゃんとそのように書いてありますね。
ウィンドウメッセージを監視すれば分かりますが、『デスクトップを表示』では通知されません。
ウィンドウ操作系のメッセージを片っ端から無視すれば可能かもしれません(確認はしてません)が、『デスクトップを表示』によって発生したものかどうかを区別する術がないので操作不能になりますね。
へにっくすさんのリンクされた先にもちゃんとそのように書いてありますね。
ウィンドウメッセージを監視すれば分かりますが、『デスクトップを表示』では通知されません。
ウィンドウ操作系のメッセージを片っ端から無視すれば可能かもしれません(確認はしてません)が、『デスクトップを表示』によって発生したものかどうかを区別する術がないので操作不能になりますね。
Re: windowsで最背面表示
つまり最背面にするには、最初に言った通りプログラムマネージャーに子ウィンドウとして設定するしかないということでしょうか?ISLe さんが書きました:ウィンドウメッセージを監視すれば分かりますが、『デスクトップを表示』では通知されません。
…困りましたね。。
Dango San
Re: windowsで最背面表示
そもそもプログラムマネージャの子ウィンドウにすると『デスクトップを表示』で最小化されないのでしょうか。
再背面にすることと最小化されないこととは関係がないのでは。
再背面にすることと最小化されないこととは関係がないのでは。
Re: windowsで最背面表示
コードは問題ありません。
最小化できなければ表示し続けるものかなと単純に考えただけですので。
お役に立てずすみません。
最小化に関しては私が原因です。ISLe さんが書きました:再背面にすることと最小化されないこととは関係がないのでは。
関係あるかなーと思ってました…orz
written by へにっくす
Re: windowsで最背面表示
とんでもないです。私のプログラムの知識、経験が上がりました。ありがとうございます。へにっくす さんが書きました:最小化できなければ表示し続けるものかなと単純に考えただけですので。
お役に立てずすみません。
誰かのブログ?になるのですがリンク貼ります。こちらです。ISLe さんが書きました:そもそもプログラムマネージャの子ウィンドウにすると『デスクトップを表示』で最小化されないのでしょうか。
他の方法も調べてみましたが、結果上記の方法しか載っていないことがほとんどでしたので質問させていただきました。
Dango San
Re: windowsで最背面表示
ちなみに、WM_SYSCOMMAND→SC_MINIMIZEを阻止すると、ウィンドウメニューの『最小化(N)』を選択したり最小化ボタンを押したりしても最小化しないというユーザーから見たら不思議な状態になります。
再背面に配置することと最小化を阻止することは別の問題だと思うので、へにっくすさんの案はアプローチとしては間違っていないと思います。
やはり『デスクトップを表示』で消えないとはどこにも書かれていないようですが。だんごさん さんが書きました:誰かのブログ?になるのですがリンク貼ります。こちらです。
他の方法も調べてみましたが、結果上記の方法しか載っていないことがほとんどでしたので質問させていただきました。
再背面に配置することと最小化を阻止することは別の問題だと思うので、へにっくすさんの案はアプローチとしては間違っていないと思います。
Re: windowsで最背面表示
申し訳ないです。最小化と最背面がごっちゃになってました。ISLe さんが書きました:やはり『デスクトップを表示』で消えないとはどこにも書かれていないようですが。
…タイトルと質問内容も違いますね。
経緯としては、私が作りたいと思っている壁紙のようなウィンドウについて調べていた際、プログラムマネージャーに子ウィンドウとして設定すると、最背面になり、最小化も防げるとのことでしたが、これではあまり良い方法ではないということで今回質問させていただきました。結果、質問が「最背面の方法」と「最小化を防ぐ方法」と、あやふやになったという感じでしょうか。申し訳ないです。
あと、そのページがこちらです→失った時を数えて
Dango San
Re: windowsで最背面表示
DXライブラリを使っているのでしたね。
『デスクトップを表示』で消えるのはしかたないと、あきらめるしかないのでは。
SetUserWindowという関数で、自前のウィンドウとウィンドウプロシージャを使うことができるようですが、ウィンドウズの内部動作とDXライブラリの内部動作がどのように影響し合うか予測できませんね。
DXライブラリの想定外の用途でしょうし。
『デスクトップを表示』で消えるのはしかたないと、あきらめるしかないのでは。
SetUserWindowという関数で、自前のウィンドウとウィンドウプロシージャを使うことができるようですが、ウィンドウズの内部動作とDXライブラリの内部動作がどのように影響し合うか予測できませんね。
DXライブラリの想定外の用途でしょうし。
Re: windowsで最背面表示
「消えないようにする」だけにこだわらず、
「適当な時間間隔(100msなど)で消えているかチェックし、消えていたら再表示する」という処理を併用するのはどうでしょうか?
「適当な時間間隔(100msなど)で消えているかチェックし、消えていたら再表示する」という処理を併用するのはどうでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: windowsで最背面表示
あ、すでにSetUserWindowは使用しています。最大化、かつ透明ウィンドウを設定するうえで効率が良いからです。ISLe さんが書きました:SetUserWindowという関数で、自前のウィンドウとウィンドウプロシージャを使うことができるようですが、ウィンドウズの内部動作とDXライブラリの内部動作がどのように影響し合うか予測できませんね。
ただ影響し合うことに関してはどうしようもないですね…。やはり難しそうですね…
なるほど、やってみます。みけCAT さんが書きました:「消えないようにする」だけにこだわらず、
「適当な時間間隔(100msなど)で消えているかチェックし、消えていたら再表示する」という処理を併用するのはどうでしょうか?
あともうひとつ質問なんですが、最大化させたときにタスクバーと被るようです。
このウィンドウをアクティブにした後はタスクバーの反応が鈍くなっています。実際にウィンドウを表示させてみたところ、もろ全画面になっていました。
最大化させるタイミングはどこでしょうか?
Dango San
Re: windowsで最背面表示
定期的にチェックしなくても、最小化されるのはWM_SIZEで分かりますけどね。
最大化についてはどういうふうに最大化しているのか分からないことには何とも。
最大化についてはどういうふうに最大化しているのか分からないことには何とも。
Re: windowsで最背面表示
この方法でやってみました。最小化は防ぐことができましたが、デスクトップ表示では消えますね。最小化とは別のようです。もうこれは諦めるしかなさそうです。ISLe さんが書きました:定期的にチェックしなくても、最小化されるのはWM_SIZEで分かりますけどね。
最背面は、アクティブにされたら最背面にする方法で解決しました。
CreateWindowExに拡張としてWS_MAXIMIZEを指定する方法ISLe さんが書きました:最大化についてはどういうふうに最大化しているのか分からないことには何とも。
ShowWindowの時にSW_MAXIMIZEを指定する方法
などやったのですが、全てタスクバーが隠れてしまいます。
ネットで調べてみると、最大化した時にタスクバーが被らなくて(隠れなくて)困っている方がほとんどで分かりませんでした…
サイズ指定時にタスクバーを除いたサイズを入れることでもできそうですね。やり方分かりませんが…
Dango San
Re: windowsで最背面表示
SystemParametersInfo関数でSPI_GETWORKAREAを指定すればできるかもしれません。だんごさん さんが書きました:サイズ指定時にタスクバーを除いたサイズを入れることでもできそうですね。やり方分かりませんが…
http://msdn.microsoft.com/ja-jp/library/cc429946.aspxプライマリモニタの作業領域のサイズを取得します。作業領域とは、画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分を意味します。
[search=google]SystemParametersInfo SPI_GETWORKAREA[/search]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: windowsで最背面表示
ウィンドウメッセージを調べてみると『デスクトップを表示』のときは、ウィンドウが遥か彼方の座標に移動してますね。
POPUPスタイルのウィンドウだと最大化したときにタスクバーも隠れるようです。
POPUPスタイルのウィンドウだと最大化したときにタスクバーも隠れるようです。
Re: windowsで最背面表示
なるほど。座標が変わっていたら元に戻す作業で表示できるかな?やってみます。ISLe さんが書きました:ウィンドウメッセージを調べてみると『デスクトップを表示』のときは、ウィンドウが遥か彼方の座標に移動してますね。
ありがとうございます、この方法でタスクバーは避けて作れました。みけCAT さんが書きました:SystemParametersInfo関数でSPI_GETWORKAREAを指定すればできるかもしれません。
なるほど!勉強になりましたISLe さんが書きました:POPUPスタイルのウィンドウだと最大化したときにタスクバーも隠れるようです。
実は画面上の透明以外(画像等)をクリックしてアクティブ化にすると、最背面処理関係なしに、タスクバーの反応に1秒程度ラグが出ます。タスクバーは動いているのだけど、マウスを感知してくれない感じになってます。それで最大化したウィンドウが関係しているのかと思ってましたが、どうやら違ったようです。
これはちょっと意味が分からないです。
Dango San
Re: windowsで最背面表示
デスクトップ表示で座標の変化が見られず、うまく表示させることができませんでした。
色々調べてみましたが、デスクトップの表示時の挙動は最小化ではなくそれ専用のウィンドウの表示が行われているだとか、結局情報が様々で本当の動きが分かりませんでした。
またプログラムマネージャーに子ウィンドウをセットしても隠されてしまうし、クラスネームにWorkerWという名前のものは見つかりませんでした(Aeroを使用しています)。
デスクトップの表示を押された時のメッセージを調べましたが、どれも反応がありませんでした。
調べたメッセージは以下の通りです。
WM_MOVE,WM_SIZE,WM_ENABLE,WM_SHOWWINDOW,WM_WINDOWPOSCHANGED
またソフトがアクティブになったときにタスクバーが数秒反応しなくなる現象については、DxLibが関係しているのかは分かりませんが、一応本家様で質問させていただきます。
ありがとうございました。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3186
色々調べてみましたが、デスクトップの表示時の挙動は最小化ではなくそれ専用のウィンドウの表示が行われているだとか、結局情報が様々で本当の動きが分かりませんでした。
またプログラムマネージャーに子ウィンドウをセットしても隠されてしまうし、クラスネームにWorkerWという名前のものは見つかりませんでした(Aeroを使用しています)。
デスクトップの表示を押された時のメッセージを調べましたが、どれも反応がありませんでした。
調べたメッセージは以下の通りです。
WM_MOVE,WM_SIZE,WM_ENABLE,WM_SHOWWINDOW,WM_WINDOWPOSCHANGED
またソフトがアクティブになったときにタスクバーが数秒反応しなくなる現象については、DxLibが関係しているのかは分かりませんが、一応本家様で質問させていただきます。
ありがとうございました。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3186
Dango San