【问题标题】:C# hide taskbar in Windows 7C# 在 Windows 7 中隐藏任务栏
【发布时间】:2012-03-21 14:07:33
【问题描述】:

我试图在 C# 中隐藏 Windows 7 任务栏。我查看了this 帖子和 this 页面,但按照所有说明操作后,我最终在底部看到了一个纯黑条。 我最终得到了一个这样的任务栏类:

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 fullscreen taskbar user32


【解决方案1】:

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

用户可能会对丢失任务栏感到恼火。任务栏属于用户而非应用。

【讨论】:

    【解决方案2】:

    你试试这个?

    还有pinvoke.net: ITaskbarList

    来自MSDN:

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

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

    【讨论】:

      【解决方案3】:

      如果您有一个 WPF 窗口,请将其 WindowStyle 设置为 None,并将其最大化,它会覆盖整个屏幕(覆盖 TaskBar)。如果您使用 Windows 窗体,类似的方法也可能有效。

      【讨论】:

      • 谢谢。最初我使用的是 Windows 窗体,但我意识到 WPF 要好得多,而且您的建议效果很好!比所有这些 [DLLImport("user32")] 更简单、更干净!我最初的(不工作的)解决方案是在一页代码上。
      • 你也可以在 WinForms 中完成。这只是一个全屏窗口。
      • 我知道,但是(至少在我的电脑上)任务栏偶尔会在烦人的时候随机出现。
      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 2013-10-26
      • 2012-04-09
      • 2013-01-26
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多