如何将winform置于所有打开的vb.net程序之后

如何将winform置于所有打开的vb.net程序之后,vb.net,winforms,Vb.net,Winforms,我正在从java程序调用vb.net exe,我希望它保留在所有已打开的程序后面 我读到你可以将TopMost设置为true,但我无法将其放在后面 有一些解决方法,比如前面的表单中的setvisible=false以及之后设置为true,但这对我的应用程序不是很好。谢谢大家! 从显示的事件处理程序调用表单的SendToBack(继承自控件)方法是关键。 例如,从load调用它不会做任何事情,因为窗口还没有“就绪” Private Sub Form1_Shown(sender As System.

我正在从java程序调用vb.net exe,我希望它保留在所有已打开的程序后面

我读到你可以将
TopMost
设置为
true
,但我无法将其放在后面


有一些解决方法,比如前面的表单中的
setvisible=false
以及之后设置为
true
,但这对我的应用程序不是很好。谢谢大家!

从显示的事件处理程序调用表单的SendToBack(继承自控件)方法是关键。 例如,从load调用它不会做任何事情,因为窗口还没有“就绪”

Private Sub Form1_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    SendToBack()
End Sub

或者,使用User32.dll中定义的本机函数

Imports System.Runtime.InteropServices

...

'Signature source: http://pinvoke.net/default.aspx/user32/SetWindowPos.html
<DllImport("user32.dll", SetLastError:=True)>
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function

...

Private Sub Form1_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    SetWindowPos(Handle, New IntPtr(1), Location.X, Location.Y, Width, Height, 0)
End Sub
导入System.Runtime.InteropServices
...
'签名来源:http://pinvoke.net/default.aspx/user32/SetWindowPos.html
专用共享函数SetWindowPos(ByVal hWnd作为IntPtr,ByVal HwnInsertafter作为IntPtr,ByVal X作为整数,ByVal Y作为整数,ByVal cx作为整数,ByVal cy作为整数,ByVal uFlags作为整数)作为布尔值
端函数
...
显示的私有子表单1_(发送方作为System.Object,e作为System.EventArgs)处理MyBase。显示
SetWindowPos(手柄,新IntPtr(1),位置.X,位置.Y,宽度,高度,0)
端接头

我对PInvoke.net提供的签名所做的唯一更改是将“uFlags”参数类型从“SetWindowPosFlags”(也在PInvoke.net上定义)更改为整数。

在程序的加载事件中,您是否尝试过?是的。当我点击java程序上的按钮时,它仍然会出现在它的前面,你可以通过vb应用程序进行一些本地调用。这够了吗?还是你特别想把表格放在后面?编辑:对不起,重读你的问题。您已经说过,您确实希望将它放在后面,那么VisualStudio中构建的东西呢?我正在使用数据,我无法测试,因为下载的东西很好的解释!非常感谢。Idk为什么从来没有人诚实地提出过这个问题。请注意,您可以使用本机函数来确定它是否失败,因为它返回一个布尔值(True表示成功,False表示失败)。您可以使用GetLastError()(PInvoke.net:)获取有关失败原因的更详细信息。