我有一个标准的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()
以编程方式关闭控制台。)
答案 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