Встраивание консоли DOS в форму Windows с помощью Visual Basic

Мне удалось найти из других вопросов некоторые данные, которые позволяют мне получить следующий код:

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 # Встраивание консоли DOS в форму Windows


person Alrik    schedule 12.01.2012    source источник
comment
Вы действительно имеете в виду DOS? Я не знал, что кто-то все еще использует MS-DOS (поддерживается ли это?)   -  person a_horse_with_no_name    schedule 12.01.2012
comment
Я имею в виду консоль Windows. Это окно.   -  person Alrik    schedule 12.01.2012
comment
Вам, вероятно, не удастся найти его, потому что он не всегда будет иметь такой заголовок: C:\\WINDOWS\\system32\\cmd.exe. У меня, например, нет.   -  person Cody Gray    schedule 12.01.2012
comment
И поскольку это VB, ваш путь должен использовать только одинарные слэши, а не двойные.   -  person Pondidum    schedule 12.01.2012
comment
Действительно полезно! Я только что им пользовался и работает безупречно. Спасибо за код и квестин   -  person Carlos Landeras    schedule 10.07.2013


Ответы (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")

Как сказал Джон Скит:

Хакерский, ужасный, но у меня работает (спасибо pinvoke.net!):

И Коди Грей тоже прав:

Вам, вероятно, не удастся найти его, потому что он не всегда будет иметь такой заголовок: C:\\WINDOWS\\system32\\cmd.exe. У меня, например, нет.

Так что это работает, но ненадежно.

person Pondidum    schedule 12.01.2012
comment
Это работает отлично (спасибо), но вы должны поместить заголовок экрана, как на языке пользователя, например, на испанском, вы должны указать Administrador: C: \ WINDOWS \ system32 \ cmd.exe, если вы не знаете точное название окна ... xD (еще раз спасибо). - person Alrik; 12.01.2012
comment
@Alrik: Нет, ты тоже так не делаешь. Я запускаю английскую версию Windows, и администратор: C: \ WINDOWS \ system32 \ cmd.exe по-прежнему не является заголовком моего окна командной строки. Подобные вещи с жестким программированием могут доставить вам неприятности. Совсем не рекомендуется. Найдите окно, используя что-нибудь, кроме подписи. - person Cody Gray; 13.01.2012
comment
Я попробую другие варианты, я полагаю, что есть другие функции, которые можно использовать в том же случае, которые избегают использования имени окна, возможно, PID. - person Alrik; 13.01.2012