3

私は XNA と C# を初めて使用します。XNA プロジェクトで、ゲームがフォーカスを失うタイミングを予測するイベント ハンドラーが必要になり、フォーカスが再び得られたときに音楽とビジュアルを同期できるようになりました。しかし、問題が 1 つあります。ゲームはドラッグ中に「更新」されませんが、これに適したイベントリスナーが見つからないようです。私はもう試した:

System.Windows.Forms.Control.FromHandle(Window.Handle).Move += new EventHandler(DeactivateGame);

これは、ウィンドウの移動中に「DeactivateGame」を何度も呼び出します。しかし、それが機能しても、関数を複数回呼び出すという事実にもかかわらず、ウィンドウハンドルが解放されたときに関数を呼び出して、「ActivateGame」を呼び出してゲームを再開できるようにするイベントハンドラーが表示されません。

補足(役立つ場合);

this.Activated += new EventHandler<EventArgs>(NotifyActivated);
this.Deactivated += new EventHandler<EventArgs>(NotifyDeactivated); 

これらのイベント ハンドラーは、ウィンドウを最小化したり、ゲーム ウィンドウ以外にフォーカスを置いたりすると正常に動作しますが、ドラッグされているウィンドウは登録されません。プログラミングに慣れている人には明らかかもしれませんが、十分な情報を提供したことを確認したいだけです

編集: イベント ハンドラーの結果として追加したい関数は、ウィンドウがフォーカスされていないかドラッグされたときに呼び出される DateTime/TimeSpan です。ドロップまたはフォーカスを再び取得すると、現在の時刻と、ウィンドウがフォーカスを失ったときに設定された時刻が比較され、その間に失われた時間が計算されます。

4

1 に答える 1

1

XNA ウィンドウがいつドラッグされているかを検出するために、Windows フォームで Window.Handle を使用して正しい軌道に乗っていました。ResizeBegin および ResizeEnd イベントをリッスンするだけで、ユーザーがウィンドウの移動を開始したタイミングと解放したタイミングを知ることができます。

var xnaWinForm = (System.Windows.Forms.Control.FromHandle(Window.Handle) as System.Windows.Forms.Form);
if (xnaWinForm != null)
{
    xnaWinForm.ResizeBegin += new EventHandler(xnaWinForm_ResizeBegin);
    xnaWinForm.ResizeEnd += new EventHandler(xnaWinForm_ResizeEnd);
}

イベント ハンドラは次のようになります。

void xnaWinForm_ResizeBegin(object sender, EventArgs e)
{
    // XNA window is starting to be moved.
}

void xnaWinForm_ResizeEnd(object sender, EventArgs e)
{
    // XNA window was released and is no longer being moved.
}

次に、これを、ウィンドウが最小化/復元/アクティブになるタイミングを判断するために言及した他のイベントと組み合わせて、ウィンドウが「非アクティブ」であった時間を判断します。

于 2013-03-25T22:28:22.720 に答える