c#在Windows 7中隐藏任务栏

本文关键字:隐藏 任务栏 Windows | 更新日期: 2023-09-27 17:52:36

我试图在c#中隐藏Windows 7任务栏。我看了这篇文章和这个页面,但在遵循了所有的说明之后,我最终在底部看到了一个简单的黑色条。我最终得到了这样一个任务栏类:

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;
    }
}

我已经截取了问题的截图:

提前谢谢你。

c#在Windows 7中隐藏任务栏

全屏显示应用程序对我来说更有意义。像这样戳任务栏的内部肯定会引起麻烦。

用户很可能会对失去任务栏感到恼火。任务栏属于用户而不是应用。

你试过吗?

  • ITaskbarList: AddTab
  • ITaskbarList: DeleteTab

还有pinvoke.net: ITaskbarList

从MSDN:

版本4.71及以后的Shell32.dll增加了修改任务栏内容的功能。现在,您可以在应用程序中添加、删除和激活任务栏按钮。激活项目不会激活窗口;在任务栏上显示按下的项目。

任务栏修改功能在组件对象模型(COM)对象(CLSID_TaskbarList)中实现,该对象公开ITaskbarList接口(IID_ITaskbarList)。你必须调用ITaskbarList::HrInit方法来初始化对象。然后,您可以使用ITaskbarList接口的方法来修改任务栏的内容。

如果你有一个WPF窗口,将其WindowStyle设置为None,并将其最大化,它将覆盖整个屏幕(覆盖任务栏)。如果你使用Windows窗体,类似的东西也可以工作。