2014-01-31 2 views
1

Я работаю над приложением WPF, где мне нужно знать, является ли мое приложение видимым для пользователя или нет. Я попробовал Application.Current.Activated/Deactivated события, чтобы изменить свойство bool и использовать этот bool для проверки в соответствии с моими требованиями. Все работает отлично, за исключением того, что событие «Деактивировано» вызывается, когда открывается всплывающее окно (например, окно галстука), или я нажимаю на панели задач, поэтому мой bool меняется.Как узнать, видно ли приложение в пользовательском интерфейсе или нет

Что я могу сделать, чтобы проверить, видимо ли мое приложение для пользователя, а не активировано/деактивировано (что проверяет, является ли мое приложение приоритетным или нет)?

Application.Current.Activated += Current_Activated; 

    Application.Current.Deactivated += Current_Deactivated; 

    void Current_Deactivated(object sender, EventArgs e) 
    { 
     IsActive = false; 
    } 

    void Current_Activated(object sender, EventArgs e) 
    { 
     IsActive = true; 
    } 

И если! IsActive Я показываю уведомление.

+1

Код публикации никогда не болит, так как он показывает вашу отправную точку – Liath

+0

Зачем вам нужно знать, частично ли отображается ваше окно пользователю, даже если оно неактивно? Чего вы пытаетесь достичь? Окно «Активно» (с клавиатурой/мышью) или нет. Когда вы переключаетесь на другое приложение (даже небольшое всплывающее окно, покрывающее 0,1% вашего окна) или панель задач, ваше окно неактивно *. Окно «Видимое» или полностью невидимое (скрытое/сведенное к минимуму), однако, если вы перемещаете окно далеко, чтобы стать невидимым для вас * (вы не видите ни одного пикселя окна), он по-прежнему «Видимый», потому что Windows не заботится о том, что вы видите *. – Sinatr

+0

@Sinatr Мое приложение похоже на Skype (приложение для мессенджеров). Когда мое приложение не находится на переднем плане, мне нужно показать уведомления, если приходит сообщение. Проблема в том, что приложение не является приоритетным, но все еще видимым для пользователя. Мне не нужно показывать уведомление. – Raj123

ответ

-1

Есть VisibilityChanged Событие, на котором вы можете подключиться. Вы увидите текущее состояние видимости в своем EventArgs.

Позвольте мне знать, если мне нужно размещать код ;-)

+0

Не имеет ничего общего с 'VisibilityChanged', когда нам нужно проверить, частично ли видимо окно. –

+0

@AnatoliiGabuza Можете ли вы рассказать нам, как это сделать! – Raj123

0

Вы можете использовать Application.Windows property сказать вам, какие Window s были экземпляры и не закрыты (в настоящее время открыт), а затем использовать Window.IsActive property сказать, если любой из них в настоящее время активны:

Window activeWindow = 
    Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive)); 
if (activeWindow != null) 
{ 
    // activeWindow is the active Window 
} 
1
protected override void OnSourceInitialized(EventArgs e) 
{ 
    base.OnSourceInitialized(e); 
    HwndSource source = PresentationSource.FromVisual(this) as HwndSource; 
    source.AddHook(WndProc); 
} 

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == 0x1c) 
    { 
     OnActivateApp(wParam != IntPtr.Zero); 
    } 
    return IntPtr.Zero; 
} 

protected void OnActivateApp(bool activate) 
{ 
    Console.WriteLine("Activate {0}", activate); 
} 

Извините, не писать и не понимают по-английски очень хорошо, но в этой статье усовершенствовала Решение http://www.codeproject.com/Articles/704390/How-to-be-Notified-when-your-application-is-active

Смежные вопросы