2012-01-05 42 views
6

According to MS顯示當你告訴一個模式窗體在VB6不「設計」強制模式窗體在任務欄

顯示在任務欄中,但有什麼辦法使VB6模態的形式顯示在任務欄(ShowInTaskbar屬性在模態時沒有效果)

在我們的一個應用程序中,我們有一個模式登錄窗體,它是在啓動屏幕卸載後顯示在應用程序中的第一種窗體,所以如果用戶移動頂部的另一個窗口,您不知道它被加載。

回答

6

您可以使用類似這樣的模式窗體

Private Const WS_EX_APPWINDOW    As Long = &H40000 
Private Const GWL_EXSTYLE     As Long = (-20) 
Private Const SW_HIDE      As Long = 0 
Private Const SW_SHOW      As Long = 5 

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 

Private m_bActivated As Boolean 

Private Sub Form_Activate() 
    If Not m_bActivated Then 
     m_bActivated = True 
     Call SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_APPWINDOW) 
     Call ShowWindow(hwnd, SW_HIDE) 
     Call ShowWindow(hwnd, SW_SHOW) 
    End If 
End Sub 
+0

優秀的簡單解決方案謝謝 – 2012-01-06 10:09:48

1

您將不得不進行子類化,如來自VBAccelerator的this

免責聲明 - 改編自PM2的答案this question這是可能重複,但我們不能說,因爲原來的海報從來沒有告訴我們他們的形式是否爲模式。

+0

感謝@Jeff用於固定鏈接! – MarkJ 2014-05-01 12:27:57

3

將這個代碼在你的模式窗口:


    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 

    Private Sub Form_Activate() 
     Call ShowWindow(Me.hWnd, vbHide) 
     Me.Caption = Me.Caption 
     Call ShowWindow(Me.hWnd, vbNormalFocus) 
    End Sub 

+0

這對我很有用,比子類更容易。有人可以解釋「Me.Caption = Me.Caption」的用途嗎? – 2015-07-30 17:35:16

+0

據我所知,它會導致Windows更新某些窗口的屬性,以便重新評估當您再次顯示時窗口是否應出現在任務欄中。通過在ShowWindow中使用vbNormalFocus標誌,只要窗口的某些屬性「已更改」,窗口就會將它視爲窗口首次顯示。 – cjc 2016-11-16 23:21:41