2017-08-25 47 views
0

我的應用程序,當不聚焦或最小化或其他窗口後面需要顯示通知窗口,以引起注意。並且需要在用戶預先提交應用程序時關閉通知窗口。需要一種方法來確定應用程序的主要形式是從任務欄上的其他窗口的頂部

我能夠確定的主要形式(即我的應用程序)是否處於活動

FormWindowState.Minimized和this.Handle的組合!=則activeWindow

現在,如果用戶用應用程序,我必須刪除通知窗口。

爲了確定我在應用程序的主窗體和Form_Activated內部使用Form_Activated,我試圖找到主窗體的主窗體是活動的。

我嘗試了以下方法,但並未在用戶可以預先使用該應用程序的所有方案中工作。


訂閱的Form.ActiveForm和在側確定它是主要的形式 - Form.ActiveForm是MainForm的

  1. 當用戶最小化的應用和它restors - 工作正常

    2.當用戶使用Alt + Tab將應用程序預先帶入時 - 可以正常工作

    3.當用戶指定KS從任務欄中的應用程序圖標了 - 不工作


使用的IntPtr GetForegroundWindow()

  1. 當用戶最小化應用和restors它 - 工作正常

  2. 當用戶使用Alt + Tab來提前提交該應用程序 - 由於未檢索到句柄而不起作用

    3.當用戶從任務欄點擊應用程序圖標了 - 不工作當手柄沒有檢索


使用this.Focused - 在上述情況下,假


使用IntPtr GetTopWindow(IntPtr hwnd) like GetTopWindow((sender as MainForm).Handle).ToString() != "0」。這是正確的,即使是顯示的通知窗口這是不是我想要的。


如果我只是認購Form_Activated,顯示在通知窗口時,那麼也mainForm_Activated被激發。因此,我需要在這裏做一些額外的檢查,所有的方法我試過以上,沒有變成成功的用戶可以把應用前景的所有方式。

任何幫助將不勝感激。

+0

沒有檢查沒有應用程序最小化/恢復類型事件 - 或者只是delphi – BugFinder

+0

我沒有檢查任何應用程序最小化事件。 – soms

+0

我試圖登錄痕跡當控制在Form_Activated event.And我做了以下內容:點擊幾次在bar.If應用任務的應用程序圖標是不是在其他窗口的頂部,然後點擊這會帶來將應用程序放在前面。再次單擊將隱藏應用程序。令人驚訝的在窗口前看到,該form_activated是打不和,當應用程序是不可見的(任務欄上的圖標,接下來點擊)觸發的事件Form_Activated,我可以看到日誌。 – soms

回答

0

的問題是,當點擊隱藏應用程序的任務欄按鈕重複點擊將觸發啓動事件,當點擊顯示application.So onResize受到()也保持不會觸發事件。

protected override void OnActivated(EventArgs e) 
    { 
     IntPtr activeWindow = Engine.GetForegroundWindow(); 
        if ((this).Handle == activeWindow) 
        { 
         MainFormActive?.Invoke(this, EventArgs.Empty); 

        } 
    } 

調整大小

protected override void OnResize (EventArgs e) 

{ 

if (previousState == FormWindowState.Minimized && this.WindowState == FormWindowState.Normal) 

// raise OnActivated 

} 

另外我看到下面的實用 - 處理WM_NCACTIVATE中的WndProc

if (m.Msg == Engine.WM_NCACTIVATE) 
{ 
    if ((this).Handle == Engine.GetForegroundWindow())     
     { 
      // Do what ever     
     } 
} 

WM_NCACTIVATE = 0x0086

Taskbar Minimize C# Windows Form Problem

Is there Windows system event on active window changed?

相關問題