2011-08-13 7 views
10

私のアプリケーションがアクティブであるかどうかを判断する方法はありますか?つまり、どのウィンドウに.IsActive = trueがありますか?私のアプリケーションがアクティブかどうかを判断する方法(フォーカスを持っている)

私はメッセンジャーアプリを書いていて、非アクティブで新しいメッセージが到着したときにタスクバーで点滅したいと思っています。

+2

フォームのOnActivateメソッドとOnDeactiveメソッドをオーバーライドします。ボタンを点滅させることはユーザーインターフェイスのアプローチとしては最大のものではなく、代わりにNotifyIconを検討してください。しかし、拡張された不活動がある場合にのみバルーンを表示します。 –

答えて

8

使用済みP /呼び出しとループ

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern IntPtr GetForegroundWindow(); 

private static bool IsActive(Window wnd) 
{ 
    // workaround for minimization bug 
    // Managed .IsActive may return wrong value 
    if (wnd == null) return false; 
    return GetForegroundWindow() == new WindowInteropHelper(wnd).Handle; 
} 

public static bool IsApplicationActive() 
{ 
    foreach (var wnd in Application.Current.Windows.OfType<Window>()) 
     if (IsActive(wnd)) return true; 
    return false; 
} 
+0

申し訳ありませんが、これは、現在のチェックウィンドウがアクティブであるかどうかのみ可能ですか?それとも、窓を前面に持っていくこともできますか? – qakmak

7

メインウィンドウのActivatedイベントにサブスクライブして、何でも構いません。試してもらえますか?

-3

アクティブなウィンドウをWindows APIで見つけてアクティブなウィンドウのプロセス名を見つける方法があります(より良い方法があるかもしれません)。もう一つの方法は、すべてのウィンドウの参照を保持し、あなたのアプリがアクティブであるかどうかを知りたいときだけ別の方法をすべてのウィンドウを反復処理し、IsActive

をチェックすることができ

if(yourProcessName == ActiveWindowProcessName) 
{ 
    //your window is in focus 
} 

ができMainWindowのOwnedWindowsプロパティを使用してください。新しいウィンドウを作成するたびにメインウィンドウを割り当て、それは所有者です。その後、メインウィンドウのすべてOwnedWindowsを反復処理し、いずれかがアクティブであるかどうかを確認することができます。

+0

なぜ複雑になるのですか?アプリケーションのウィンドウ状態を確認するための完全なインフラストラクチャーがあると同時に、プロセスレベルに移動する理由を理解できません。 – sll

+0

私はそれを使用するように提案していません。可能なすべての方法を教えています。 –

2

は、これを試して、あなたのMainFormにOnActivatedメソッドをオーバーライドして、あなたが

protected override void OnActivated(EventArgs e) 
    { 
     // TODO : Implement your code here. 
     base.OnActivated(e); 
    } 

ホップをやりたい(この方法を試したことがありません)このヘルプ

1

ActivatedDeactivatedのイベントはApplicationです。

あなたはIsActiveに結合することができるようにしたい場合、あなたはまた、

App application = Application.Current as App; 
bool isActive = application.IsActive; 

App.xamlのようなコードでこのプロパティにアクセスすることができ、もちろんApp.xaml.cs

<TextBlock Text="{Binding Path=IsActive, 
          Source={x:Static Application.Current}}"/> 

にプロパティを追加することができます.cs

public partial class App : Application, INotifyPropertyChanged 
{ 
    private bool m_isActive; 
    public bool IsActive 
    { 
     get { return m_isActive; } 
     private set 
     { 
      m_isActive = value; 
      OnPropertyChanged("IsActive"); 
     } 
    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     Activated += (object sender, EventArgs ea) => 
     { 
      IsActive = true; 
     }; 
     Deactivated += (object sender, EventArgs ea) => 
     { 
      IsActive = false; 
     }; 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

適切なアイデアを持っていますが、動作する可能性の低いコードを投稿しました。 OnStartup()はVB.NETの実装の詳細ですが、C#アプリケーションではほとんどWindowsFormsApplicationBaseクラスを使用しません。 OnActivateメソッドとOnDeactivateメソッドをオーバーライドするだけです。 –

+0

@Hans Passant:ここで何を意味するのか分かりません。たとえば、WPFアプリケーションで起動引数を取得する場合は、OnStartupをオーバーライドします。私はOnActivate/OnDeactivateをオーバーライドすることがよりきれいな解決策であることに同意しますが、私はこれが機能しない理由は見当たりません。また、私はそれを試してみる前に答えを提出しなかったし、それはうまく実行されます –

+0

@ハンスパッサント:私はあなたがこのタグをよく読んでいないと思う、これはWPFであり、Windowsフォームではありません:) –

関連する問題