Vb.net 在picturebox中运行另一个应用程序

Vb.net 在picturebox中运行另一个应用程序,vb.net,process,Vb.net,Process,这是我用来在picturebox中运行另一个应用程序的示例代码: Imports System.Diagnostics Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> Public Shared Function SetParent(ByVal hwndChild As IntPtr, ByVal hwndNewParent As IntPtr) As In

这是我用来在picturebox中运行另一个应用程序的示例代码:

Imports System.Diagnostics
Imports System.Runtime.InteropServices
Public Class Form1
    <DllImport("user32.dll")> Public Shared Function SetParent(ByVal hwndChild As IntPtr, ByVal hwndNewParent As IntPtr) As Integer
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Process1 As New Process
        Process1.StartInfo.FileName = "notepad.exe"
        Process1.Start()

        Do Until Process1.WaitForInputIdle = True
            Application.DoEvents()
        Loop
        SetParent(Process1.MainWindowHandle, PictureBox1.Handle)

    End Sub
End Class
导入系统诊断
导入System.Runtime.InteropServices
公开课表格1
公共共享函数SetParent(ByVal hwndChild作为IntPtr,ByVal hwnnewparent作为IntPtr)作为整数
端函数
私有子按钮1\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理按钮1。单击
Dim Process1作为新流程
Process1.StartInfo.FileName=“notepad.exe”
Process1.Start()
直到Process1.WaitForInputId=True为止
Application.DoEvents()
环
SetParent(Process1.MainWindowHandle,PictureBox1.Handle)
端接头
末级
因此,我能够在我的VB2010 WindowsForm中托管另一个应用程序,它运行良好。但问题是,在Windows7中,Windows会请求权限(无论是否允许EXE运行)。单击“允许”按钮后,exe应用程序将在其自己的窗口中打开,而不是作为PictureBox的子窗口打开

我认为当Windows请求权限时,它跳过了SetParent()API调用。我非常感谢你的建议


谢谢:)

很抱歉延迟发布解决方案。VBForums.com的EdgeMeal帮助我找到了解决这个问题的方法。您可以在此处查看详细信息:

为了提升权限,即在应用程序启动时请求管理员权限,我们需要更改
requestedExecutionLevel
值。要更改此设置,请转到项目属性(项目菜单-->属性)。然后从
应用程序
选项卡中,单击
查看窗口设置
按钮。这将打开
app.manifest
文件。在本例中,更改以下行(未注释行):


致:


这将在您运行应用程序时请求管理员权限。即使您从IDE运行它,它也会要求以管理员权限重新打开IDE

顺便说一句,我假设您将使用VB2010。以上步骤适用于VB2010(不确定是否也适用于其他版本)


希望这对正在为同一问题进行斗争的人有所帮助。:)

您可以在
Do-till
SetParent
之间使用以下语句:

系统线程线程睡眠(250)


这种黑客行为有很多局限性,其有效的唯一原因是为Windows3.x程序提供兼容性。在浏览器选项卡中运行的Adobe软件很好地演示了许多其他问题。其中一个限制是不允许非提升进程劫持提升进程的窗口。您必须先提升自己。@HansPassant提升托管过程时,它也不起作用。谢谢您的回复。我尝试使用以下行:
Process1.startInfo.Verb=“runas”
。但这也没有显示出任何运气(有趣的想法;想知道这可以用于什么实际应用?
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />