在控制台关闭时阻止Windows窗体应用程序关闭

时间:2014-02-01 22:05:59

标签: vb.net console

我有一个标准的Windows窗体应用程序,我需要一个解决方案来在Windows窗体应用程序设置中打开控制台。我提出了这个解决方案:

Public Class Win32

    <DllImport("kernel32.dll")>
    Public Shared Function AllocConsole() As Boolean
    End Function

    <DllImport("kernel32.dll")>
    Public Shared Function FreeConsole() As Boolean
    End Function

' ...

Win32.AllocConsole()
Console.WriteLine("Test")

使用上面的P / Invoke函数,我可以打开一个控制台,而我的应用程序不是“控制台应用程序”。

我现在遇到的问题是,当我关闭控制台窗口时,它会退出我的程序并关闭所有窗体和Windows。有没有办法阻止用户关闭控制台窗口,或者在控制台窗口关闭时阻止程序退出? (我可以使用Win32.FreeConsole()以编程方式关闭控制台。)

1 个答案:

答案 0 :(得分:1)

我想你可能会觉得这很有意思,试一试;对我来说很棒!另一个注意事项:用户无法点击关闭按钮,因为它被禁用,唯一的出路就是如何设置...

 Imports System.Collections.Generic
 Imports System.Windows.Forms
 Imports System.Runtime.InteropServices
 Imports System.Diagnostics
 Imports Microsoft.Win32

 Public Class Form1

 <DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function AllocConsole() As Boolean
End Function

<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function FreeConsole() As Boolean
End Function

Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Integer, _
 ByVal uPosition As Integer, ByVal uFlags As Integer) As Boolean
Private Declare Function GetForegroundWindow Lib "user32" () As Integer
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Integer, _
   ByVal bRevert As Boolean) As Integer
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, _
   ByVal uCmd As Integer) As Integer
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer


Private Sub btnStartConsole_Click(sender As Object, e As EventArgs) Handles btnStartConsole.Click
    StartConsole()
End Sub

Private Sub StartConsole()
    AllocConsole()
    Console.Title = "TEST"
    ' Obtain a handle to the console application window by passing the title of your application.
    Dim hWnd As Integer = ObtainWindowHandle("TEST") 'Can change this, but must match the name you give it!'

    ' Obtain a handle to the console application system menu.
    Dim hMenu As Integer = GetSystemMenu(hWnd, False)

    ' Delete the Close menu item from the console application system menu.
    ' This will automatically disable the Close button on the console application title bar.
    DeleteMenu(hMenu, 6, 1024)

    Console.WriteLine("We have a console! Enter something!")
    ' Read value.
    Dim s As String = Console.ReadLine()
    ' Write the value.
    Console.WriteLine("You typed " + s)
    Console.WriteLine("Press any key! ...")
    Console.ReadLine()

    FreeConsole()
End Sub

Private Function ObtainWindowHandle(ByVal lpstrCaption As String) As Integer

    ' To store the handle to a window.
    Dim hWnd As Integer
    ' Maximum number of characters in the GetWindowText method.
    Dim nMaxCount As Integer
    ' Actual number of characters copied in the GetWindowText method.
    Dim nCopiedLength As Integer
    ' To store the text of the title bar of the window.
    Dim lpString As String

    nMaxCount = 255
    ' Obtain a handle to the first window.
    hWnd = GetForegroundWindow

    ' Loop through the various windows until you encounter the console application window, _
    ' or there are no more windows.
    While hWnd <> 0

        ' Fill lpString with spaces.
        lpString = Space(nMaxCount)
        ' Get the text of the title bar of the window in lpString.
        nCopiedLength = GetWindowText(hWnd, lpString, nMaxCount)

        ' Verify that lpString is neither empty, nor NULL.
        If Len(Trim(lpString)) <> 0 And Asc(Trim(lpString)) <> 0 Then
            ' Verify that the title of the retrieved window is the same as the title of the console application window.
            If CType(InStr(Microsoft.VisualBasic.Left(lpString, nCopiedLength), lpstrCaption), Boolean) Then
                ' Return hWnd to the Main method.
                Return hWnd
            End If
        End If

        ' Get the next window.
        hWnd = GetWindow(hWnd, 2)

    End While

    ' If no corresponding windows are found, return 0.
    Return 0

End Function
End Class