【问题标题】:Embedding a DOS console in a windows form with Visual Basic使用 Visual Basic 在 Windows 窗体中嵌入 DOS 控制台
【发布时间】:2012-02-08 13:06:29
【问题描述】:

我已经设法从其他问题中找到了一些数据,可以让我实现下一个代码:

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# 中的问题 Embedding a DOS console in a windows form

【问题讨论】:

  • 你真的是指DOS吗?我不知道有人还在使用 MS-DOS(现在还在维护吗?)
  • 我的意思是一个 Windows 控制台。 This window.
  • 你可能找不到它,因为它并不总是有这个标题:C:\\WINDOWS\\system32\\cmd.exe。例如,我的没有。
  • 因为这是 VB,所以你的路径只能使用单斜杠,而不是双斜杠。
  • 真的很有帮助!我刚刚使用它并且工作完美无瑕。感谢您的代码和问题

标签: .net windows vb.net winapi windows-console


【解决方案1】:

使用bring a console window to front in 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")

正如乔恩·斯基特所说:

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

Cody Gray 对此也是正确的:

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

所以它可以工作,但是是片状的。

【讨论】:

  • 这很好用(谢谢),但是你必须把屏幕的标题放在用户的语言中,例如在西班牙语中你必须把“管理员:C:\WINDOWS\system32\ cmd.exe”,如果您不知道窗口的确切名称... xD(再次感谢)。
  • @Alrik:不,你也不是那样做的。我运行英文版的 Windows,“管理员:C:\WINDOWS\system32\cmd.exe”仍然不是我的命令提示符窗口的标题。像这样的硬编码会让你陷入困境。完全不推荐。使用标题以外的内容查找窗口。
  • 我会尝试其他选项,我想在相同的情况下可以使用其他类型的函数来避免使用窗口名称可能是 PID。
猜你喜欢
  • 2010-09-26
  • 2014-01-15
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多