Скрыть заголовок программы с помощью API - PullRequest
4 голосов
/ 06 января 2010

Можно удалить строку заголовка оконной консоли, используя c # и windows api, если да, то как? Пожалуйста.

Ответы [ 5 ]

2 голосов
/ 06 января 2010

Это простое приложение скрывает и показывает строку заголовка консоли, в которой оно находится. Оно мгновенно меняет заголовок консоли на guid, чтобы найти дескриптор окна. После этого он использует ToggleTitleBar, чтобы показать или скрыть, используя найденный дескриптор.

public class Program
{
    public static void ToggleTitleBar(long hwnd, bool showTitle)
    {
        long style = GetWindowLong(hwnd, -16L);
        if (showTitle)
            style |= 0xc00000L;
        else
            style &= -12582913L;
        SetWindowLong(hwnd, -16L, style);
        SetWindowPos(hwnd, 0L, 0L, 0L, 0L, 0L, 0x27L);
    }

    public static void Main()
    {
        Guid guid = Guid.NewGuid();
        string oldTitle = Console.Title;
        Console.Title = guid.ToString();
        int hwnd = FindWindow("ConsoleWindowClass", guid.ToString());
        Console.Title = oldTitle;

        Console.WriteLine("Press enter to hide title");
        Console.ReadLine();
        ToggleTitleBar(hwnd, false);
        Console.WriteLine("Press enter to show title");
        Console.ReadLine();
        ToggleTitleBar(hwnd, true);
        Console.WriteLine("Press enter to exit");
        Console.ReadLine();
    }

    [DllImport("user32", EntryPoint = "GetWindowLongA")]
    public static extern long GetWindowLong(long hwnd, long nIndex);

    [DllImport("user32", EntryPoint = "SetWindowLongA")]
    public static extern long SetWindowLong(long hwnd, long nIndex, long dwNewLong);

    [DllImport("user32")]
    public static extern long SetWindowPos(long hwnd, long hWndInsertAfter, long x, long y, long cx, long cy,
                                           long wFlags);

    [DllImport("User32.dll")]
    public static extern int FindWindow(string lpClassName, string lpWindowName);
}
1 голос
/ 06 января 2010

Редактировать: Извините, я вижу, что вы ищете решение для консольного приложения. Нет, я не знаю, как сделать то, что ты пытаешься сделать. Также не просто разместить консоль в приложении WinForms.

Однако, если вы используете приложение WinForms или WPF, учтите следующее.

this.ControlBox = false;
this.Text = string.Empty;

В противном случае вы можете установить FormBorderStyle на None.

Вы также можете скрыть программу из панели задач, если вам нужно.

this.ShowInTaskBar = false;
0 голосов
/ 06 января 2010

используйте FindWindow, чтобы получить дескриптор окна консоли, затем SetWindowLong, чтобы изменить его свойства

0 голосов
/ 06 января 2010

У меня есть (очень) старый код, который, я думаю, как-то связан; Я бы отобразил Microsoft Excel в приложении winform:

[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern int SetParent(int hWndChild, int hWndNewParent);

[DllImport("user32.dll")]
public static extern int MoveWindow(
    int hWnd, int x, int y, 
    int nWidth, int nHeight, int bRepaint);

//
private static int hwnExcel = 0;
private System.Windows.Forms.PictureBox picContainer;
// ...
private void Principal_Resize(object sender, EventArgs e)
{
    picContainer.Width = this.Width - 8;
    picContainer.Height = this.Height - 45;
    User32.SetParent(hwnExcel, 0);
    User32.MoveWindow(
        hwnExcel, 0, 0, 
        picContainer.Width, picContainer.Height, 1);
}
0 голосов
/ 06 января 2010

Это, вероятно, не будет работать. Теоретически вы можете использовать что-то вроде этого:

    HWND handle = FindWindow(L"ConsoleWindowClass", NULL);
    LONG style = GetWindowLong(handle, GWL_STYLE);
    style = style & ~WS_CAPTION;
    SetWindowLong(handle, GWL_STYLE, style);

Это будет работать для всех окон, кроме консольных. SetWindowLong возвращает 0, а GetLastError возвращает 5 (доступ запрещен), даже если вы запускаете приложение от имени администратора.

...