C # скрыть панель задач в Windows 7 - PullRequest
2 голосов
/ 22 апреля 2011

Я пытаюсь скрыть панель задач Windows 7 в C #.Я просмотрел эту запись и эту страницу, но после выполнения всех инструкций у меня появилась черная полоса внизу.Я получил класс панели задач, подобный этому:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

public static class Taskbar
{
    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
    [DllImport("user32.dll")]
    private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
    [DllImport("user32.dll")]
    private static extern uint GetWindowThreadProcessId(IntPtr hwnd, out int lpdwProcessId);

    private const int SW_HIDE = 0;
    private const int SW_SHOW = 5;

    private const string VistaStartMenuCaption = "Start";
    private static IntPtr vistaStartMenuWnd = IntPtr.Zero;
    private delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam);

    public static void Show()
    {
        SetVisibility(true);
    }

    public static void Hide()
    {
        SetVisibility(false);
    }

    public static bool Visible
    {
        set { SetVisibility(value); }
    }

    private static void SetVisibility(bool show)
    {
        IntPtr taskBarWnd = FindWindow("Shell_TrayWnd", null);

        IntPtr startWnd = FindWindowEx(taskBarWnd, IntPtr.Zero, "Button", "Start");
        if (startWnd == IntPtr.Zero)
        {
            startWnd = FindWindow("Button", null);

            if (startWnd == IntPtr.Zero)
            {
                startWnd = GetVistaStartMenuWnd(taskBarWnd);
            }
        }

        ShowWindow(taskBarWnd, show ? SW_SHOW : SW_HIDE);
        ShowWindow(startWnd, show ? SW_SHOW : SW_HIDE);
    }

    private static IntPtr GetVistaStartMenuWnd(IntPtr taskBarWnd)
    {
        int procId;
        GetWindowThreadProcessId(taskBarWnd, out procId);

        Process p = Process.GetProcessById(procId);
        if (p != null)
        {
            foreach (ProcessThread t in p.Threads)
            {
                EnumThreadWindows(t.Id, MyEnumThreadWindowsProc, IntPtr.Zero);
            }
        }
        return vistaStartMenuWnd;
    }

    private static bool MyEnumThreadWindowsProc(IntPtr hWnd, IntPtr lParam)
    {
        StringBuilder buffer = new StringBuilder(256);
        if (GetWindowText(hWnd, buffer, buffer.Capacity) > 0)
        {
            Console.WriteLine(buffer);
            if (buffer.ToString() == VistaStartMenuCaption)
            {
                vistaStartMenuWnd = hWnd;
                return false;
            }
        }
        return true;
    }
}

Я сделал скриншот проблемы:

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 22 апреля 2011

Для меня было бы больше смысла показывать ваше приложение в полноэкранном режиме. Подобные движения внутри панели задач, несомненно, вызовут проблемы.

Пользователи, вероятно, будут раздражены потерей панели задач. Панель задач принадлежит пользователю, а не приложению.

2 голосов
/ 22 апреля 2011

Вы пробуете это?

А также pinvoke.net: ITaskbarList

ОТ MSDN :

В версии 4.71 и более поздних версиях Shell32.dll добавлена ​​возможность изменять содержимое панели задач. Из приложения вы можете добавлять, удалять и активировать кнопки панели задач. Активация элемента не активирует окно; показывает элемент как нажатый на панели задач.

Возможности модификации панели задач реализованы в объекте Component Object Model (COM) (CLSID_TaskbarList), который предоставляет интерфейс ITaskbarList (IID_ITaskbarList). Вы должны вызвать метод ITaskbarList :: HrInit для инициализации объекта. Затем вы можете использовать методы интерфейса ITaskbarList для изменения содержимого панели задач.

1 голос
/ 22 апреля 2011

Если у вас есть окно WPF, установите его WindowStyle на None и максимизируйте его, оно будет охватывать весь экран (охватывающий панель задач).Если вы используете Windows Forms, может сработать что-то подобное.

...