DirectDrawでフルスクリーンの256色グラフィックモードを使用する古いビデオゲームを維持しています。問題は、バックグラウンドで実行されている一部のアプリケーションが、ゲームの実行中にシステムパレットを変更しようとすることがあり、その結果、グラフィックが破損することです。
WM_PALETTECHANGEDメッセージを処理することで、これがいつ発生するかを(場合によっては)検出できます。いくつかの更新バージョンでは、ログを追加しました(ウィンドウのタイトル/クラス/プロセス名をログに記録するだけです)。これにより、ユーザーは問題のあるアプリケーションを特定して閉じることができます。MSNLiveMessengerが一般的な原因でした。
Windows Vista(および7)が「単独で」それを実行することがわかったとき、問題はさらに悪化しました。WM_PALETTECHANGEDパラメーターは、CSRSSとデスクトップウィンドウを指します。Vistaでは、よく機能する回避策は、任意のフォルダー(コンピューター、ドキュメントなど)を開き、ゲームの実行中は開いたままにすることでした。ばかげているように聞こえますが、ほとんどの場合、うまくいきました。Windows 7では、この回避策でさえ機能しなくなりました。一部のサービス(Windows Updateおよびインデックスサービス)を停止しても、一部の構成で問題が解決したことがユーザーからわかりました。
少し前に、私は解決策を見つけることを期待してランダムなことを試し始めました。DirectDrawパレットを設定する前に(Create / SelectPaletteを使用して)GDIパレットを設定すると(IDirectDrawPalette :: SetEntriesを使用)、破損したパレット(WM_PALETTECHANGEDハンドラー)が復元されることがわかりました。SetSystemPaletteUseとプライマリサーフェスでのSetPaletteの呼び出しは、さらに役立ちました。ただし、アプリケーションがパレットを盗もうとすると、ちらつきが認識されます。これは、フェード時に特に顕著です。
質問:ゲームがフォーカスを保持している限り、他のアプリケーションがWindowsパレットを変更することを完全に禁止する「本物の」排他的なパレットを取得する方法はありますか?