VB.NET MS Project如何在应用程序面前带来一个表单?

时间:2018-03-15 11:47:42

标签: ms-project

我有一个表单作为VSTO项目应用程序的一部分。由于各种原因,它可能最终落在主项目应用程序窗口的后面。如何将它带回到前面?我已经尝试过form.activate和form.bringtofront,但这些命令都没有做任何事情。

2 个答案:

答案 0 :(得分:1)

以下是用于在vb.net MS Project加载项中显示/重新显示表单的代码。如果表单落在另一个窗口后面,调用ShowTkForm会将它带回到前面:

Friend formTk As tk
Friend Sub ShowTkForm()
    If formTk Is Nothing OrElse formTk.IsDisposed Then
        formTk = New tk
    End If
    formTk.Show()
End Sub

注意:对于无模式表单,请使用.Show方法,否则请使用.ShowDialog

对于无模式表单,我还想将表单的所有者设置为MS Project应用程序以将它们保持在一起。在表单的Load事件中:

    Dim ip As IntPtr = FindWindowByCaption(0, ProjApp.Caption)
    SetWindowLong(New HandleRef(Me, Me.Handle), GWL_HWNDPARENT, New HandleRef(Nothing, ip))

需要:

Friend Const GWL_HWNDPARENT = (-8)
<DllImport("user32.dll", EntryPoint:="SetWindowLong", CharSet:=CharSet.Auto)>
Private Function SetWindowLongPtr32(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="SetWindowLongPtr", CharSet:=CharSet.Auto)>
Private Function SetWindowLongPtr64(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
Friend Function SetWindowLong(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
    If (IntPtr.Size = 4) Then
        Return SetWindowLongPtr32(hWnd, nIndex, dwNewLong)
    End If
    Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
End Function

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)>
Friend Function FindWindowByCaption(ByVal zero As IntPtr, ByVal lpWindowName As String) As IntPtr
End Function

答案 1 :(得分:0)

听起来您希望自己的表单为modal。我不确定您正在使用哪种表单库,但如果这是一个MS Project VBA表单,那么您将表单的.ShowModal属性设置为True:{{3} }。

假设您使用的是.NET表单,这可能更合适:https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/showmodal-property