フルスクリーンを検出して非表示にするには?

解決


 2007-07-29 14:03:54  No: 65884  IP: 192.*.*.*

現在、デスクトップ上にシステム情報等を常に表示するプログラムを作成しております。
情報を表示するウィンドウは常にデスクトップ情報に表示しておきたいのですが
ゲーム等でフルスクリーンに切り替わった際、邪魔にならないようウィンドウを非表示にするにはどうしたらいいでしょうか?

常に他のウィンドウを監視し、大きさとスクリーンサイズを比較するしかないでしょうか?

皆様方のお知恵をお貸しください。

編集 削除
 2007-07-29 14:05:32  No: 65885  IP: 192.*.*.*

大変申し訳ありません、誤字がありましたので訂正させて頂きます。

“常にデスクトップ情報に表示しておきたいのですが”を
“常にデスクトップ上に表示しておきたいのですが”に訂正をお願いします

編集 削除
オショウ  2007-07-29 16:47:20  No: 65886  IP: 192.*.*.*

OSや言語は何でしょうか?
できる場合と出来ない場合があると思います。

因みに、.NETでなら・・・
http://dobon.net/vb/dotnet/system/userpreferencechanged.html

こういう機能でイベントを拾えたら、思惑とおりのものが
できるでしょう。

※  当然、Win32 API に基本となる機能があるはずですが。

参考までに。

以上。

編集 削除
夏みかん  2007-07-29 16:52:20  No: 65887  IP: 192.*.*.*

API の ChangeDisplaySettings() 関数で実現できそうだよ。
http://oshiete1.goo.ne.jp/qa404193.html
http://oshiete1.goo.ne.jp/qa1461181.html

あと「ChangeDisplaySettings」で検索するといろいろ見つかる。

編集 削除
夏みかん  2007-07-29 17:03:13  No: 65888  IP: 192.*.*.*

追記。
画面モードが変更されると WM_DISPLAYCHANGE メッセージが
すべてのアプリケーションに送られるようです。
このメッセージ内で画面モードをチェックすれば良いみたい。
試したことはないけど同じ理由で以前調べたことがある。
もし上手く成功したらソース教えて。

編集 削除
夏みかん  2007-07-29 17:03:15  No: 65889  IP: 192.*.*.*

追記。
画面モードが変更されると WM_DISPLAYCHANGE メッセージが
すべてのアプリケーションに送られるようです。
このメッセージ内で画面モードをチェックすれば良いみたい。
試したことはないけど同じ理由で以前調べたことがある。
もし上手く成功したらソース教えて。

編集 削除
 2007-07-29 17:51:16  No: 65890  IP: 192.*.*.*

ご返信有難うございます。
>オショウさん
言語はC++です。
OSですが、Vistaを除いてWin98以降全てに対応したいと思っております。

>夏みかんさん
メッセージが送られてくるんですね!?
有難うございます。これでかなり前進できたと思います。
うまく行きましたら、汚いながらもソースコードを張らせて頂きます。

編集 削除
 2007-07-29 19:23:47  No: 65891  IP: 192.*.*.*

おかげ様で解決いたしました。
レスして下さった方々本当に有難うございました。

まだ問題がありそうですが、以下がソースコードです。

BOOL CALLBACK EnumWindowProc( HWND hWnd, LPARAM lp )
{

  RECT  rect;
  int  iCX, iCY;

  if( hWnd == NULL || hWnd == GetDesktopWindow( ) )
  {
    return TRUE;
  }

  if( GetWindowTextLength(hWnd) )
  {
    GetWindowRect( hWnd, &rect );
    iCX = LOWORD(lp);
    iCY = HIWORD(lp);

    // テスト用
    // iCX = GetSystemMetrics( SM_CXSCREEN );
    // iCY = GetSystemMetrics( SM_CYSCREEN );

    // フルスクリーン判定
    if( !rect.top && !rect.left )
    {
      if( rect.right >= iCX && rect.bototm >= iCY )
      {
        // ここにフルスクリーン対策
      }
    }
  }

  return TRUE;

}

~~~~~~~~~~~ ウィンドウプロシージャに ~~~~~~~~~
case  WM_DISPLAYCHANGE:
  Sleep( 1000 );  // 少し待機
  EnumWindows( EnumWindowProc, lp );
  return 0;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

編集 削除