2012-01-05 37 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