问题
I've managed to find from other questions some data that allows me to achieve the next code:
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
My problem is that I can't manage to find the DOS console window.
The question in C# Embedding a DOS console in a windows form
回答1:
Using bring a console window to front in c# as a basis, you can modify your code:
<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")
As Jon Skeet said:
It's hacky, it's horrible, but it works for me (thanks, pinvoke.net!):
And Cody Gray is also correct with this:
You probably can't manage to find it because it won't always have this title:
C:\\WINDOWS\\system32\\cmd.exe
. Mine doesn't, for example.
So it works, but is flaky.
来源:https://stackoverflow.com/questions/8831761/embedding-a-dos-console-in-a-windows-form-with-visual-basic