我想知道如何獲得無邊界C#.NET控制檯應用程序。我的應用程序工作正常,但我不希望我的應用程序看起來像一個正常形式的最小化,最大化和關閉按鈕以及左上角的圖標和文本。無邊界控制檯應用程序
所以,我想知道我可以做到這一點。
我想知道如何獲得無邊界C#.NET控制檯應用程序。我的應用程序工作正常,但我不希望我的應用程序看起來像一個正常形式的最小化,最大化和關閉按鈕以及左上角的圖標和文本。無邊界控制檯應用程序
所以,我想知道我可以做到這一點。
你不能和它甚至沒有任何意義。由其輸入和輸出流表示的控制檯是系統支持的資源,其根本不必由控制檯窗口表示。例如,你的應用程序的輸入和輸出可以被重定向。
據我所知,你將需要使用的Win32更改控制檯窗口的外觀。這意味着DllImport和許多複雜性,在您的替代方案中是非常不必要的:
如果您將應用程序重新創建爲WinForms應用程序,則可以在主窗口上設置這些屬性。然後放下中間的文本框,使其停靠在窗口上,然後模擬控制檯。
我會設計一個Windows窗體應用程序與期望的外觀(無邊框),甚至與控制檯外觀黑色,然後,使其可移動
比方說,你(出於某種原因)不能使用無邊框的WinForm,而你絕對使用控制檯窗口必須使用。那麼,你可以有點使它的工作。
使用的大部分代碼從this similar problem over here,我們可以把一個解決方案,將工作。
下面是一個例子無國界的控制檯窗口:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace ConsoleBorderTest
{
class Program
{
[DllImport("USER32.DLL")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll")]
static extern bool DrawMenuBar(IntPtr hWnd);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
[DllImport("user32", ExactSpelling = true, SetLastError = true)]
internal static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] ref RECT rect, [MarshalAs(UnmanagedType.U4)] int cPoints);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetDesktopWindow();
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left, top, bottom, right;
}
private static readonly string WINDOW_NAME = "TestTitle"; //name of the window
private const int GWL_STYLE = -16; //hex constant for style changing
private const int WS_BORDER = 0x00800000; //window with border
private const int WS_CAPTION = 0x00C00000; //window with a title bar
private const int WS_SYSMENU = 0x00080000; //window with no borders etc.
private const int WS_MINIMIZEBOX = 0x00020000; //window with minimizebox
static void makeBorderless()
{
// Get the handle of self
IntPtr window = FindWindowByCaption(IntPtr.Zero, WINDOW_NAME);
RECT rect;
// Get the rectangle of self (Size)
GetWindowRect(window, out rect);
// Get the handle of the desktop
IntPtr HWND_DESKTOP = GetDesktopWindow();
// Attempt to get the location of self compared to desktop
MapWindowPoints(HWND_DESKTOP, window, ref rect, 2);
// update self
SetWindowLong(window, GWL_STYLE, WS_SYSMENU);
// rect.left rect.top should work but they're returning negative values for me. I probably messed up
SetWindowPos(window, -2, 100, 75, rect.bottom, rect.right, 0x0040);
DrawMenuBar(window);
}
static void Main(string[] args)
{
Console.Title = WINDOW_NAME;
makeBorderless();
Console.WriteLine("Can you see this?");
Console.ReadLine();
}
}
}
這是非常從引用鏈接,here和here直接複製。我嘗試獲取表單的位置,但我無法做到。我確實設法得到了尺寸,但是這個位置對我來說正在返回負值。
雖然不是很大,這是一個無國界的控制檯窗口。我真的建議只是將文本框對接到一個正常的表單。這裏有一個畫面:"You need 10 reputation to post images"...
你有什麼的畫面和一個模擬了你想要什麼,會增加2000個字的說明。 – Adrian