用Visual Basic在Windows表单中嵌入DOS控制台

3

我从其他问题中找到了一些数据,使我能够实现下面的代码:

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll")> _
    Public Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As IntPtr
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim hwnd As IntPtr
        hwnd = FindWindow(vbNullChar, "C:\\WINDOWS\\system32\\cmd.exe")

        If hwnd.Equals(IntPtr.Zero) Then
            MessageBox.Show("Got null handle")
        Else
            SetParent(hwnd, Me.Handle)
            MoveWindow(hwnd, 0, 0, Me.Width, Me.Height, False)
        End If
    End Sub
End Class

我的问题是找不到DOS控制台窗口。
在C#中的问题:如何在Windows窗体中嵌入DOS控制台

你是真的指的 DOS 吗?我不知道还有人在使用 MS-DOS(那个还在维护吗?) - user330315
我的意思是Windows控制台。这个窗口 - Alrik
你可能找不到它,因为它的标题并不总是这个:C:\\WINDOWS\\system32\\cmd.exe。例如,我的电脑就不是这样的。 - Cody Gray
2
而且由于这是VB,你的路径应该只使用单斜杠,而不是双斜杠。 - Pondidum
真的很有帮助!我刚刚使用了它,而且运行非常顺畅。感谢提供代码和问题。 - Carlos Landeras
1个回答

1

在C#中将控制台窗口置于前台 为基础,您可以修改您的代码:

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True)> _
Private Shared Function FindWindowByCaption(ByVal zeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr
End Function

''in frmLoad:
hwnd = FindWindowByCaption(IntPtr.Zero, "c:\WINDOWS\system32\cmd.exe")

正如Jon Skeet所说:

这很hacky,很可怕,但对我有用(感谢pinvoke.net!):

Cody Gray也是正确的:

你可能找不到它,因为它并不总是有这个标题:C:\\WINDOWS\\system32\\cmd.exe。例如,我的没有。

所以它可以工作,但不太稳定。


这个完美运作(谢谢),但你必须将屏幕的标题放置在用户的语言中,例如在西班牙语中,您必须放置“Administrador:C:\WINDOWS\system32\cmd.exe”,如果您不知道窗口的确切名称... xD(再次感谢)。 - Alrik
1
@Alrik:不,这也不是正确的方法。我使用的是英文版Windows,“Administrator: C:\WINDOWS\system32\cmd.exe”仍然不是我的命令提示符窗口的标题。像这样硬编码东西会让你陷入麻烦。绝对不推荐。使用其他方式查找窗口。 - Cody Gray
我会尝试其他选项,我认为在相同的情况下可以使用其他类型的函数,避免使用窗口名称,也许是使用PID。 - Alrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接