トップページ > 過去ログ > 記事閲覧
GetActiveFlag及びGetWindowActive
名前:sy(サイ) 日時: 2011/10/18 01:44

SetAlwaysRunFlag( int Flag ) をFALSEにするとGetActiveFlagとGetWindowActiveFlagの戻り値が常にTRUEになるというバグがあります。 この値を使って非アクティブ時にBGMを止めたいので修正をお願いしますm(_ _)m 追記: 少し調べてWin32 APIのGetActiveWindowを使った見たら結果は同じ・・・。 非アクティブの時はどのようにしてソフトを停止しているのでしょうか? 追記: なんて事ない・・・。ProcessMessageの中から出てこないのでした・・・。(多分) 非アクティブでのプログラム処理はライブラリに任せられないという事が分かりました・・・。

Page: 1 |

Re: GetActiveFlag及びGetWindowActive ( No.1 )
名前:管理人 日時:2011/10/22 19:02

DXライブラリはデフォルトではメインウインドウが非アクティブになった際に ライブラリ内部の様々な箇所に仕掛けてある「アクティブになるまで処理を止める」プログラムで メインウインドウがアクティブになるまでそこで処理が止まるようになっています ( ProcessMessage も非アクティブなら処理を止める関数の内の一つです ) その機能をOFFにするための関数が SetAlwaysRunFlag で、この関数に TRUE を 渡して呼び出すことでメインウインドウが非アクティブでも処理を止めることなく 動作させることができます なので、恐らく sy(サイ)さんがされようとお考えの処理は予め SetAlwaysRunFlag に TRUE を渡して実行し、非アクティブ時でも処理を止めないようにした上で GetActiveFlag の戻り値を監視して FALSE になった際に処理とBGMを止める、 ということをすることで実現できると思います 若しくは、ウインドウのアクティブ状態が変化したときに呼ばれるコールバック関数を登録する SetActiveStateChangeCallBackFunction という非公開関数を使用する方法もあります // ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数をセットする( CallBackFunction に NULL を渡すと設定をリセットできる ) int SetActiveStateChangeCallBackFunction( int (* CallBackFunction )( int ActiveState , void *UserData ) , void *UserData ) ; 第一引数にアクティブ状態が変化したときに呼ばれる関数を、 第二引数にコールバック関数の第二引数として渡す void 型のアドレスを渡します。 ( 第二引数は特に必要が無い場合はNULL で大丈夫です ) コールバック関数は第一引数に変化後のアクティブ状態( TRUE:アクティブ FALSE:非アクティブ )を、 第二引数に void 型のアドレスを持つものである必要があります この関数を使用してウインドウがアクティブになる度にグローバル変数の値を インクリメントするサンプルプログラムを組んでみましたので、よろしければ ご覧になってみてください #include "DxLib.h" int ActiveCount = 0 ; // ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数 int ActiveStateChange( int ActiveState, void *UserData ) { // アクティブに変化した場合にカウントする if( ActiveState != FALSE ) { ActiveCount ++ ; } // 終了 return 0 ; } // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; // ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数をセットする( NULL をセットすると呼ばれなくなる ) SetActiveStateChangeCallBackFunction( ActiveStateChange, NULL ) ; // 描画先画面を裏にする SetDrawScreen( DX_SCREEN_BACK ) ; // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面を初期化 ClsDrawScreen() ; // 文字列の描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ActiveCount:%d", ActiveCount ) ; // 表画面と裏画面を取り替えます ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } コールバック関数内で ActiveState が FALSE になった際にBGMを止める という処理を加えれば sy(サイ)さんの意図する処理を実現することができると思います ただ、このサンプルプログラムを実行して分かったのですが、現在のバージョンでは 非アクティブになった際にコールバック関数が2回呼ばれるようになってしまっていました 修正版をアップしましたので、もし SetActiveStateChangeCallBackFunction をお使いに なられる際はこちらの修正バージョンをお使いください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: GetActiveFlag及びGetWindowActive ( No.2 )
名前:sy(サイ)(解決) 日時:2011/10/23 13:38

自分で止める処理を実装する事にします。 ありがとうございました。

Page: 1 |