gpt4 book ai didi

vb.net - 关闭控制台时防止 Windows 窗体应用程序关闭

转载 作者:行者123 更新时间:2023-12-04 15:58:13 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why does closing a console that was started with AllocConsole cause my whole application to exit? Can I change this behavior?

(4 个回答)


7年前关闭。




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

最佳答案

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

 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

关于vb.net - 关闭控制台时防止 Windows 窗体应用程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504253/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com