2012-08-17 49 views
0

内的另一个应用程序这是我用一个PictureBox内运行其他应用程序的示例代码:运行一个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 

因此,我能够举办我的VB2010 WindowsForm内的另一个应用程序,它工作正常。但问题是,在Windows7中,Windows会询问权限(是否允许EXE运行)。点击“允许”按钮后,exe应用程序将在它自己的窗口上打开,而不是作为PictureBox的子项。

我想当Windows询问权限时,它将跳过SetParent()API调用。我非常感谢任何建议。

谢谢:)

+0

有很多限制到这个技巧,唯一的原因它的工作原理是为Windows 3.x程序提供兼容性。许多其他问题,由运行在浏览器选项卡上的Adobe软件很好地演示。一个这样的限制是,非升级的过程不被允许劫持高架的窗口。你必须先让自己升高。 – 2012-08-17 13:29:37

+0

@HansPassant当提升主机进程时它不起作用。 – ken2k 2012-08-17 13:34:41

+0

感谢您的回复。我尝试使用这一行:'Process1.startInfo.Verb =“runas”'。但是这也没有显示任何运气。 :( – 2012-08-17 16:50:30

回答

0

对不起,推迟发布解决方案。来自VBForums.com的EdgeMeal帮助我找到解决此问题的解决方法。您可以在这里查看详细信息:thread at vbforums.com

而对于提升权限,即在应用程序启动时要求获得管理权限,我们需要更改requestedExecutionLevel值。要改变这个,转到项目属性(工程菜单 - >属性)。然后从Application选项卡单击View Windows Settings按钮。这将打开app.manifest文件。在此,更改以下行(注释行):

<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 

到:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

这将要求管理员权限,只要你运行应用程序。即使从IDE运行它,它也会要求使用Admin权限重新打开IDE。

顺便说一句,我以为你会使用VB2010。以上步骤适用于VB2010(不确定它是否也适用于其他版本)。

希望它对正在与同一问题斗争的人有所帮助。 :)

+0

有趣的想法;想知道这可以用于什么实际应用? – 2016-08-15 18:40:48

0

您可以使用Do UntilSetParent之间下面的语句:

System.Threading.Thread.Sleep(250)