windowsで最背面表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
だんごさん
記事: 273
登録日時: 12年前

windowsで最背面表示

#1

投稿記事 by だんごさん » 10年前

WinAPIとDxLibで、デスクトップの壁紙のようなものを作っています。
ウィンドウは透明化、ツールバー非表示など主な設定はできました。
しかし、「デスクトップを表示」および「Windowsキー+Dキー」でデスクトップを表示させる時に、一緒に消えてしまいます。これについて色々調べた結果、Program Manager、Aero有効時だとWorkWに子ウィンドウとして設定する方法があるらしいのですが、あまり良い方法ではありませんし、もし配布するとなると相手側のPCで何が起こるか保証できないので、別の方法を探しています。
一応自分なりに考えてみて、定期的にHWND_BOTTOMを使って最背面にし、同時にアクティブ化をして消されても良いようにしてみたのですが、やっぱりうまくいきませんでした。
何かいい方法はありますでしょうか?

C言語
VC++2010
Windows 7
 Dango San

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: windowsで最背面表示

#2

投稿記事 by へにっくす » 10年前

すでに試してたならすみません。VB、C#だけどVC++に置き換えることはできるっしょ
[VB、C#]フォームの最大化、最小化、元のサイズに戻すをキャンセルする
※デスクトップを表示/Windows+Dで何が起こっているのかというと、すべてのウィンドウに対して最小化メッセージを出してるからです。それを無効にしてはどうかということ。
written by へにっくす

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#3

投稿記事 by だんごさん » 10年前

コード:

case WM_SYSCOMMAND:
		switch (wParam)
		{
            case SC_MINIMIZE:
                return true;
		}
break;
こんな感じにしてみましたがやはり消えてしまいました。
というかコードはこれであってるでしょうか?なんか不安なんですが…
 Dango San

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: windowsで最背面表示

#4

投稿記事 by へにっくす » 10年前

return trueはダメですね。下記のリンクによると、処理した場合は0を返すとありますよ。
それ以外は処理してないってシステムに言うことになるので、デフォルトの動作をすることになりますよ。
また、wParamをそのまま判定してはいけませんよ。下4ビットを無視するようにしないといけません。
下記のリンクをよーく読んで、修正してください。
WM_SYSCOMMAND
written by へにっくす

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#5

投稿記事 by だんごさん » 10年前

コード:

int type = wParam & 0xFFF0;
	switch( msg )
	{
		case WM_SYSCOMMAND:
			switch ( type )
			{
				case SC_MINIMIZE:
					return 0;
			}
			break;
  ・
  ・
こんな感じのコードでよろしいでしょうか?
ただデスクトップ表示では依然消えてしまいます。
 Dango San

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#6

投稿記事 by ISLe » 10年前

WM_SYSCOMMANDは、ユーザー操作やシステムからの事前通知的なメッセージです。
へにっくすさんのリンクされた先にもちゃんとそのように書いてありますね。

ウィンドウメッセージを監視すれば分かりますが、『デスクトップを表示』では通知されません。

ウィンドウ操作系のメッセージを片っ端から無視すれば可能かもしれません(確認はしてません)が、『デスクトップを表示』によって発生したものかどうかを区別する術がないので操作不能になりますね。

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#7

投稿記事 by だんごさん » 10年前

ISLe さんが書きました:ウィンドウメッセージを監視すれば分かりますが、『デスクトップを表示』では通知されません。
つまり最背面にするには、最初に言った通りプログラムマネージャーに子ウィンドウとして設定するしかないということでしょうか?
…困りましたね。。
 Dango San

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#8

投稿記事 by ISLe » 10年前

そもそもプログラムマネージャの子ウィンドウにすると『デスクトップを表示』で最小化されないのでしょうか。
再背面にすることと最小化されないこととは関係がないのでは。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: windowsで最背面表示

#9

投稿記事 by へにっくす » 10年前

だんごさん さんが書きました:

コード:

int type = wParam & 0xFFF0;
	switch( msg )
	{
		case WM_SYSCOMMAND:
			switch ( type )
			{
				case SC_MINIMIZE:
					return 0;
			}
			break;
  ・
  ・
こんな感じのコードでよろしいでしょうか?
ただデスクトップ表示では依然消えてしまいます。
コードは問題ありません。
最小化できなければ表示し続けるものかなと単純に考えただけですので。
お役に立てずすみません。
ISLe さんが書きました:再背面にすることと最小化されないこととは関係がないのでは。
最小化に関しては私が原因です。
関係あるかなーと思ってました…orz
written by へにっくす

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#10

投稿記事 by だんごさん » 10年前

へにっくす さんが書きました:最小化できなければ表示し続けるものかなと単純に考えただけですので。
お役に立てずすみません。
とんでもないです。私のプログラムの知識、経験が上がりました。ありがとうございます。
ISLe さんが書きました:そもそもプログラムマネージャの子ウィンドウにすると『デスクトップを表示』で最小化されないのでしょうか。
誰かのブログ?になるのですがリンク貼ります。こちらです。
他の方法も調べてみましたが、結果上記の方法しか載っていないことがほとんどでしたので質問させていただきました。
 Dango San

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#11

投稿記事 by ISLe » 10年前

ちなみに、WM_SYSCOMMAND→SC_MINIMIZEを阻止すると、ウィンドウメニューの『最小化(N)』を選択したり最小化ボタンを押したりしても最小化しないというユーザーから見たら不思議な状態になります。
だんごさん さんが書きました:誰かのブログ?になるのですがリンク貼ります。こちらです。
他の方法も調べてみましたが、結果上記の方法しか載っていないことがほとんどでしたので質問させていただきました。
やはり『デスクトップを表示』で消えないとはどこにも書かれていないようですが。

再背面に配置することと最小化を阻止することは別の問題だと思うので、へにっくすさんの案はアプローチとしては間違っていないと思います。

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#12

投稿記事 by だんごさん » 10年前

ISLe さんが書きました:やはり『デスクトップを表示』で消えないとはどこにも書かれていないようですが。
申し訳ないです。最小化と最背面がごっちゃになってました。
…タイトルと質問内容も違いますね。

経緯としては、私が作りたいと思っている壁紙のようなウィンドウについて調べていた際、プログラムマネージャーに子ウィンドウとして設定すると、最背面になり、最小化も防げるとのことでしたが、これではあまり良い方法ではないということで今回質問させていただきました。結果、質問が「最背面の方法」と「最小化を防ぐ方法」と、あやふやになったという感じでしょうか。申し訳ないです。

あと、そのページがこちらです→失った時を数えて
 Dango San

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#13

投稿記事 by ISLe » 10年前

DXライブラリを使っているのでしたね。
『デスクトップを表示』で消えるのはしかたないと、あきらめるしかないのでは。

SetUserWindowという関数で、自前のウィンドウとウィンドウプロシージャを使うことができるようですが、ウィンドウズの内部動作とDXライブラリの内部動作がどのように影響し合うか予測できませんね。
DXライブラリの想定外の用途でしょうし。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsで最背面表示

#14

投稿記事 by みけCAT » 10年前

「消えないようにする」だけにこだわらず、
「適当な時間間隔(100msなど)で消えているかチェックし、消えていたら再表示する」という処理を併用するのはどうでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#15

投稿記事 by だんごさん » 10年前

ISLe さんが書きました:SetUserWindowという関数で、自前のウィンドウとウィンドウプロシージャを使うことができるようですが、ウィンドウズの内部動作とDXライブラリの内部動作がどのように影響し合うか予測できませんね。
あ、すでにSetUserWindowは使用しています。最大化、かつ透明ウィンドウを設定するうえで効率が良いからです。
ただ影響し合うことに関してはどうしようもないですね…。やはり難しそうですね…
みけCAT さんが書きました:「消えないようにする」だけにこだわらず、
「適当な時間間隔(100msなど)で消えているかチェックし、消えていたら再表示する」という処理を併用するのはどうでしょうか?
なるほど、やってみます。


あともうひとつ質問なんですが、最大化させたときにタスクバーと被るようです。
このウィンドウをアクティブにした後はタスクバーの反応が鈍くなっています。実際にウィンドウを表示させてみたところ、もろ全画面になっていました。
最大化させるタイミングはどこでしょうか?
 Dango San

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#16

投稿記事 by ISLe » 10年前

定期的にチェックしなくても、最小化されるのはWM_SIZEで分かりますけどね。

最大化についてはどういうふうに最大化しているのか分からないことには何とも。

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#17

投稿記事 by だんごさん » 10年前

ISLe さんが書きました:定期的にチェックしなくても、最小化されるのはWM_SIZEで分かりますけどね。
この方法でやってみました。最小化は防ぐことができましたが、デスクトップ表示では消えますね。最小化とは別のようです。もうこれは諦めるしかなさそうです。
最背面は、アクティブにされたら最背面にする方法で解決しました。
ISLe さんが書きました:最大化についてはどういうふうに最大化しているのか分からないことには何とも。
CreateWindowExに拡張としてWS_MAXIMIZEを指定する方法
ShowWindowの時にSW_MAXIMIZEを指定する方法
などやったのですが、全てタスクバーが隠れてしまいます。
ネットで調べてみると、最大化した時にタスクバーが被らなくて(隠れなくて)困っている方がほとんどで分かりませんでした…
サイズ指定時にタスクバーを除いたサイズを入れることでもできそうですね。やり方分かりませんが…
 Dango San

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: windowsで最背面表示

#18

投稿記事 by みけCAT » 10年前

だんごさん さんが書きました:サイズ指定時にタスクバーを除いたサイズを入れることでもできそうですね。やり方分かりませんが…
SystemParametersInfo関数でSPI_GETWORKAREAを指定すればできるかもしれません。
プライマリモニタの作業領域のサイズを取得します。作業領域とは、画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分を意味します。
http://msdn.microsoft.com/ja-jp/library/cc429946.aspx
[search=google]SystemParametersInfo SPI_GETWORKAREA[/search]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: windowsで最背面表示

#19

投稿記事 by ISLe » 10年前

ウィンドウメッセージを調べてみると『デスクトップを表示』のときは、ウィンドウが遥か彼方の座標に移動してますね。

POPUPスタイルのウィンドウだと最大化したときにタスクバーも隠れるようです。

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#20

投稿記事 by だんごさん » 10年前

ISLe さんが書きました:ウィンドウメッセージを調べてみると『デスクトップを表示』のときは、ウィンドウが遥か彼方の座標に移動してますね。
なるほど。座標が変わっていたら元に戻す作業で表示できるかな?やってみます。
みけCAT さんが書きました:SystemParametersInfo関数でSPI_GETWORKAREAを指定すればできるかもしれません。
ありがとうございます、この方法でタスクバーは避けて作れました。
ISLe さんが書きました:POPUPスタイルのウィンドウだと最大化したときにタスクバーも隠れるようです。
なるほど!勉強になりました

実は画面上の透明以外(画像等)をクリックしてアクティブ化にすると、最背面処理関係なしに、タスクバーの反応に1秒程度ラグが出ます。タスクバーは動いているのだけど、マウスを感知してくれない感じになってます。それで最大化したウィンドウが関係しているのかと思ってましたが、どうやら違ったようです。
これはちょっと意味が分からないです。
 Dango San

だんごさん
記事: 273
登録日時: 12年前

Re: windowsで最背面表示

#21

投稿記事 by だんごさん » 10年前

デスクトップ表示で座標の変化が見られず、うまく表示させることができませんでした。
色々調べてみましたが、デスクトップの表示時の挙動は最小化ではなくそれ専用のウィンドウの表示が行われているだとか、結局情報が様々で本当の動きが分かりませんでした。
またプログラムマネージャーに子ウィンドウをセットしても隠されてしまうし、クラスネームに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

閉鎖

“C言語何でも質問掲示板” へ戻る