【问题标题】:Run or Embed VB.NET console application within a VB.NET or C# forms application在 VB.NET 或 C# 表单应用程序中运行或嵌入 VB.NET 控制台应用程序
【发布时间】:2015-02-26 17:38:36
【问题描述】:

我为管理/管理功能编写了一堆相关的 VB.NET 控制台应用程序。

我现在想将它们放在一个用作启动器的 Windows 窗体应用程序下,但我不想将应用程序作为单独的程序启动,而是将应用程序嵌入到 Windows 窗体应用程序中,例如在左侧有一个可滚动的图标列表 - 单击一个将在 Windows 窗体应用程序的右侧窗格中启动关联的 .exe。

目前我有一个带有一个面板的简单单表单应用程序,因此我可以测试我想做的事情是否可行。

阅读了 MSDN 和 SO,我发现了其他关于此的帖子,但似乎没有一个符合我的要求。

我不想拦截 stin/stdout/stderr 流并尝试模拟控制台应用程序,我想实际运行已编译的 exe(我可以实现)但让它在 windows 窗体中运行(我可以'没有实现,它作为一个单独的过程启动)。

我现在拥有的Form1的主要代码是:

Public Class Form1
Declare Auto Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const WM_SYSCOMMAND As Integer = 274
Private Const SC_MAXIMIZE As Integer = 61488
Dim proc As Process

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    proc = Process.Start("\\fileserver\datashare\path\WIN_MGR.exe")
    proc.WaitForInputIdle()
    SetParent(proc.MainWindowHandle, Me.Panel1.Handle)
    SendMessage(proc.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
End Sub

End Class

谁能让我在正确的方向上实际运行在 windows 窗体中窗口化的 .exe 应用程序?

【问题讨论】:

  • 也许这会有所帮助:stackoverflow.com/questions/12340329/…
  • 恐怕这些解决方案仍然试图拦截一个单独运行但隐藏的控制台应用程序版本的 stdin/stdout/stderr 流,这是我试图避免做的事情- 如果可以避免,为什么还要尝试模仿已经运行的东西? (能不能避免还有待观察)
  • vb-helper.com/howto_net_run_dos.html 不知道有没有用,有时间可以看看
  • 您的代码对我有用如果我将proc.WaitForInputIdle() 替换为Thread.Sleep(1000)WaitForInputIdle调用失败是因为控制台没有图形界面,但是代码似乎需要短暂的停顿(等待控制台句柄被创建?)。
  • 如果您不想要一个固定的延迟,您可以在一个较短的延迟循环中轮询 MainWindowHandle,直到它不等于 IntPtr.Zero。如果控制台应用程序可以修改,那么您可以使用“主机”应用程序将它们设置为 communicate

标签: vb.net forms console-application


【解决方案1】:

根据 cmets,更改您的 Form_Load 如下:

proc = Process.Start("\\fileserver\datashare\path\WIN_MGR.exe")
Thread.Sleep(1000)  'Possibly replace this with polling MainWindowHandle
SetParent(proc.MainWindowHandle, Me.Panel1.Handle)
SendMessage(proc.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)

WaitForInputIdle 失败,因为控制台应用程序没有图形界面。为了获得更准确的延迟,Idle_Mind 建议在 while 循环中轮询 MainWindowHandle,直到它返回一个不同于 IntPtr.Zero 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多