从任务栏隐藏外部应用程序

时间:2013-12-08 19:48:44

标签: c#

我浏览了很多不同的论坛,但我找不到办法。我想从任务栏隐藏外部应用程序图标,但没有最小化应用程序。我不知道从哪里开始,或者怎么做。任何帮助将不胜感激。

注意隐藏外部应用程序图标,而不是我的表单图标。

3 个答案:

答案 0 :(得分:5)

您可以使用ShowWindow功能执行此操作。这是一个小样本,它将隐藏任务栏中正在运行的“calc.exe”。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

internal class Program
{
    /// <summary>Shows a Window</summary>
    /// <remarks>
    /// <para>To perform certain special effects when showing or hiding a 
    /// window, use AnimateWindow.</para>
    ///<para>The first time an application calls ShowWindow, it should use 
    ///the WinMain function's nCmdShow parameter as its nCmdShow parameter. 
    ///Subsequent calls to ShowWindow must use one of the values in the 
    ///given list, instead of the one specified by the WinMain function's 
    ///nCmdShow parameter.</para>
    ///<para>As noted in the discussion of the nCmdShow parameter, the 
    ///nCmdShow value is ignored in the first call to ShowWindow if the 
    ///program that launched the application specifies startup information 
    ///in the structure. In this case, ShowWindow uses the information 
    ///specified in the STARTUPINFO structure to show the window. On 
    ///subsequent calls, the application must call ShowWindow with nCmdShow 
    ///set to SW_SHOWDEFAULT to use the startup information provided by the 
    ///program that launched the application. This behavior is designed for 
    ///the following situations: </para>
    ///<list type="">
    ///    <item>Applications create their main window by calling CreateWindow 
    ///    with the WS_VISIBLE flag set. </item>
    ///    <item>Applications create their main window by calling CreateWindow 
    ///    with the WS_VISIBLE flag cleared, and later call ShowWindow with the 
    ///    SW_SHOW flag set to make it visible.</item>
    ///</list></remarks>
    /// <param name="hWnd">Handle to the window.</param>
    /// <param name="nCmdShow">Specifies how the window is to be shown. 
    /// This parameter is ignored the first time an application calls 
    /// ShowWindow, if the program that launched the application provides a 
    /// STARTUPINFO structure. Otherwise, the first time ShowWindow is called, 
    /// the value should be the value obtained by the WinMain function in its 
    /// nCmdShow parameter. In subsequent calls, this parameter can be one of 
    /// the WindowShowStyle members.</param>
    /// <returns>
    /// If the window was previously visible, the return value is nonzero. 
    /// If the window was previously hidden, the return value is zero.
    /// </returns>
    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

    /// <summary>Enumeration of the different ways of showing a window using 
    /// ShowWindow</summary>
    private enum WindowShowStyle : uint
    {
        /// <summary>Hides the window and activates another window.</summary>
        /// <remarks>See SW_HIDE</remarks>
        Hide = 0,
        /// <summary>Activates and displays a window. If the window is minimized 
        /// or maximized, the system restores it to its original size and 
        /// position. An application should specify this flag when displaying 
        /// the window for the first time.</summary>
        /// <remarks>See SW_SHOWNORMAL</remarks>
        ShowNormal = 1,
        /// <summary>Activates the window and displays it as a minimized window.</summary>
        /// <remarks>See SW_SHOWMINIMIZED</remarks>
        ShowMinimized = 2,
        /// <summary>Activates the window and displays it as a maximized window.</summary>
        /// <remarks>See SW_SHOWMAXIMIZED</remarks>
        ShowMaximized = 3,
        /// <summary>Maximizes the specified window.</summary>
        /// <remarks>See SW_MAXIMIZE</remarks>
        Maximize = 3,
        /// <summary>Displays a window in its most recent size and position. 
        /// This value is similar to "ShowNormal", except the window is not 
        /// actived.</summary>
        /// <remarks>See SW_SHOWNOACTIVATE</remarks>
        ShowNormalNoActivate = 4,
        /// <summary>Activates the window and displays it in its current size 
        /// and position.</summary>
        /// <remarks>See SW_SHOW</remarks>
        Show = 5,
        /// <summary>Minimizes the specified window and activates the next 
        /// top-level window in the Z order.</summary>
        /// <remarks>See SW_MINIMIZE</remarks>
        Minimize = 6,
        /// <summary>Displays the window as a minimized window. This value is 
        /// similar to "ShowMinimized", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWMINNOACTIVE</remarks>
        ShowMinNoActivate = 7,
        /// <summary>Displays the window in its current size and position. This 
        /// value is similar to "Show", except the window is not activated.</summary>
        /// <remarks>See SW_SHOWNA</remarks>
        ShowNoActivate = 8,
        /// <summary>Activates and displays the window. If the window is 
        /// minimized or maximized, the system restores it to its original size 
        /// and position. An application should specify this flag when restoring 
        /// a minimized window.</summary>
        /// <remarks>See SW_RESTORE</remarks>
        Restore = 9,
        /// <summary>Sets the show state based on the SW_ value specified in the 
        /// STARTUPINFO structure passed to the CreateProcess function by the 
        /// program that started the application.</summary>
        /// <remarks>See SW_SHOWDEFAULT</remarks>
        ShowDefault = 10,
        /// <summary>Windows 2000/XP: Minimizes a window, even if the thread 
        /// that owns the window is hung. This flag should only be used when 
        /// minimizing windows from a different thread.</summary>
        /// <remarks>See SW_FORCEMINIMIZE</remarks>
        ForceMinimized = 11
    }


    private static void Main(string[] args)
    {
        Process[] p = Process.GetProcessesByName("calc"); 

        if(p.Length > 0)
        {
            IntPtr hWnd = p[0].MainWindowHandle;

            ShowWindow(hWnd, WindowShowStyle.Hide);
        }

        Console.ReadLine();
    }
}

答案 1 :(得分:2)

没有非常简单的方法可以做到这一点。使顶层窗口不显示在任务栏中的方法是:

  1. 让它由另一个窗口拥有。您无法执行此操作,因为所有者是在窗口创建时确定的。
  2. 为其提供WS_EX_TOOLWINDOW扩展窗口样式。你可以这样做,但它会改变窗口的外观。
  3. 调用ITaskbarList::DeleteTab传递窗口句柄。虽然这会起作用,但我相信在某些情况下,任务栏按钮会返回。
  4. 基本上,你试图做的是违反规则。如果系统不易使您篡改其他应用程序,请不要感到惊讶。

答案 2 :(得分:1)

Form类提供ShowInTaskbar属性。将其设置为false,最好在InitializeComponent之后的构造函数中,winform应用程序将不会显示在Windows任务栏中。

public MyForm()
{
   InitializeComponent();
   this.ShowInTaskbar = false;
}