6

ユーザーが別のアプリケーションに移動するたびに一時停止したいゲームがあります。たとえば、チャーム メニューが選択されている場合、ユーザーは Windows キーを押したり、Alt-Tab キーを押して別のアプリケーションに移動したり、別のアプリケーションをクリックしたり、アプリケーションのフォーカスを失う可能性のあるその他の操作を行ったりします。

もちろん、これは些細なことです。Page私はとしか持っておらず、でイベントをCanvas試しましたが、それらは起動しません。GotFocusLostFocusCanvas

最も近いのは、ポインターをキャプチャした後PointerCaptureLostに onを使用することです。CoreWindowこれは、チャーム メニューが選択されている場合のアプリケーションの切り替えには機能しますが、Windows キーが押された場合には機能しません。

編集:

以下の Chris Bowen の助けを借りて、最終的な「解決策」は次のとおりです。

public MainPage() {
    this.InitializeComponent();
    CapturePointer();
    Window.Current.CoreWindow.PointerCaptureLost += PointerCaptureLost;
    Window.Current.CoreWindow.PointerPressed += PointerPressed;
    Window.Current.VisibilityChanged += VisibilityChanged;
}

private void VisibilityChanged(object sender, VisibilityChangedEventArgs e) {
    if(e.Visible) {
        CapturePointer();
    }
    else {
        Pause();
    }
}

void PointerPressed(CoreWindow sender, PointerEventArgs args) {
    CapturePointer();
}

private void CapturePointer() {
    if(hasCapture == false) {
        Window.Current.CoreWindow.SetPointerCapture();
        hasCapture = true;
    }
}

void PointerCaptureLost(CoreWindow sender, PointerEventArgs args) {
    hasCapture = false;
    Pause();
}

private bool hasCapture;

それはまだ簡単な方法であるように思われるので、もっとエレガントなものを見つけたら教えてください.

4

2 に答える 2

7

Window.VisibilityChangedイベントを使用してみてください。このようなもの:

public MainPage()
{
    this.InitializeComponent();
    Window.Current.VisibilityChanged += Current_VisibilityChanged;
}

void Current_VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e)
{
    if (!e.Visible) 
    {
        //Something useful
    }
}

チャームのアクティベーションはキャッチされませんが、あなたが言及した他のケースでは機能するはずです.

于 2012-09-29T13:08:32.447 に答える
0

onSuspendingApp.xaml.cs で定義済みのイベントを使用して、ゲームの一時停止を処理してみてください。アプリケーションが中断されるたびにイベントが発生するため、機能する可能性があります。このイベントは、アプリ内のいずれかのページが中断されたときに発生するため、ゲームを一時停止しようとする前に、ゲームが実際に実行されていることを確認するなどのチェックを行う必要がある場合があります。

于 2012-09-29T11:08:38.267 に答える