2011-08-13 29 views
10

Có cách nào để biết liệu ứng dụng của tôi có đang hoạt động hay không, tức là bất kỳ cửa sổ nào của ứng dụng đều có .IsActive = true?Cách xác định xem ứng dụng của tôi có đang hoạt động hay không (đã tập trung)

Tôi đang viết ứng dụng nhắn tin và muốn nó nhấp nháy trên thanh tác vụ khi nó không hoạt động và tin nhắn mới đến.

+2

Ghi đè phương thức OnActivate và OnDeactive của biểu mẫu. Các nút nhấp nháy không phải là cách tiếp cận giao diện người dùng lớn nhất, thay vào đó hãy xem xét một NotifyIcon. Nhưng chỉ hiển thị bóng khi đã không còn hoạt động. –

Trả lời

8

Được sử dụng P/Invoke và loop

[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

Xin lỗi, Điều này có thể chỉ để kiểm tra cửa sổ hiện tại đang hoạt động hay không? Hoặc cũng có thể mang cửa sổ về phía trước? – qakmak

7

Bạn có thể đăng ký sự kiện Activated của Cửa sổ chính và sau đó thực hiện bất cứ điều gì bạn muốn. Bạn có thể thử không?

-3

Một cách (có thể có cách tốt hơn) có thể tìm cửa sổ Hoạt động thông qua Windows API, sau đó tìm tên quy trình của cửa sổ hiện hoạt.

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

Một cách khác có thể là để giữ một tài liệu tham khảo của tất cả các cửa sổ và khi bạn muốn tìm hiểu xem ứng dụng của bạn đang hoạt động hay không chỉ lặp qua tất cả các cửa sổ và kiểm tra IsActive giá trị

Một cách khác có thể sử dụng tài sản OwnedWindows của MainWindow. Bất cứ khi nào bạn đang tạo một cửa sổ mới chỉ định cửa sổ chính là chủ sở hữu. Sau đó, bạn có thể lặp lại tất cả các OwnedWindows của MainWindow và kiểm tra xem nào đang hoạt động hay không. (Chưa bao giờ thử phương pháp này)

+0

Tại sao quá phức tạp, tôi không hiểu tại sao chúng tôi đi xuống mức quá trình khi cùng lúc chúng tôi có một cơ sở hạ tầng hoàn chỉnh để kiểm tra trạng thái Cửa sổ Ứng dụng – sll

+0

Tôi không đề nghị sử dụng nó. Tôi đang nói tất cả các cách có thể –

2

thử này, ghi đè phương pháp OnActivated trong MainForm của bạn và làm bất cứ điều gì bạn muốn

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

hop trợ giúp này

1

Bạn có các sự kiện ActivatedDeactivated của Application.

Nếu bạn muốn để có thể liên kết với IsActive bạn có thể thêm một tài sản trong App.xaml.cs

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

tất nhiên bạn cũng có thể truy cập vào tài sản này trong mã như

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

App.xaml .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

Bạn có ý tưởng đúng nhưng được đăng mã không có khả năng hoạt động. OnStartup() là một chi tiết thực hiện VB.NET, các ứng dụng C# hiếm khi sử dụng lớp WindowsFormsApplicationBase. Chỉ cần ghi đè lên các phương thức OnActivate và OnDeactivate. –

+0

@Hans Passant: Tôi không chắc tôi hiểu ý của bạn ở đây. Nếu bạn muốn lấy các đối số khởi động ví dụ trong một ứng dụng WPF, bạn ghi đè OnStartup. Mặc dù tôi đồng ý rằng ghi đè OnActivate/OnDeactivate là một giải pháp đẹp hơn, tôi không thấy lý do nào cho việc này không hoạt động.Ngoài ra, tôi đã không gửi câu trả lời trước khi thử nó và nó chỉ chạy tốt –

+0

@ Pass Passant: Tôi nghĩ rằng bạn đã không đọc các thẻ cũng đủ thời gian này, đây là WPF và không Windows Forms :) –

Các vấn đề liên quan