隐藏任务栏中的外部应用程序

6

我浏览了许多不同的论坛,但是找不到解决方法。我想要隐藏任务栏上的外部应用程序图标,但不想将应用程序最小化。我不知道从哪里开始,也不知道该如何做。非常感谢任何帮助。

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


外部应用程序是什么类型的应用程序?控制台还是窗口化?另外,您目前是如何启动外部应用程序的,请编辑您的问题并包含执行此操作的代码。 - Scott Chamberlain
这是个玩笑吗?我按原样将你的标题复制到谷歌上,有很多有用的结果。 - zerkms
应用程序是窗口化的。 - user3053347
@Scott Chamberlain:“注意隐藏外部应用程序图标,而不是我的表单图标。” --- 可能是一个窗口化的应用程序。 - zerkms
@zerkms - 我已经搜索了大约30分钟... 没有找到任何答案。 - user3053347
3个回答

7
您可以使用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();
    }
}

它被隐藏了,但我无法将其恢复回来 :( - Furkan Gözükara
Process[] p = Process.GetProcessesByName("calc");如果(p.Length > 0) { IntPtr hWnd = p[0].MainWindowHandle;ShowWindow(hWnd, WindowShowStyle.ShowNoActivate);}Console.ReadLine(); - Furkan Gözükara

1

要做到这一点并不容易。使顶级窗口不出现在任务栏的方法有:

  1. 将其作为另一个窗口的所有者。您不能这样做,因为所有者是在创建窗口时确定的。
  2. 给它WS_EX_TOOLWINDOW扩展窗口样式。您可以这样做,但它会改变窗口的外观。
  3. 调用ITaskbarList::DeleteTab并传递窗口句柄。虽然这样可以起作用,但我认为在某些情况下,任务栏按钮会重新出现。

实际上,你试图做的事情是违反规则的。不要感到惊讶,如果系统不会让你轻易地干涉其他应用程序。


这基本上是说SHOW_WINDOW不是要进行的室外呼叫。但作为一名Windows程序员,我必须尊重地不同意你的观点。你可以在Windows上做任何事情。通常这只是一个愿不愿意深入底层的问题。 - code4life
1
@code4life 你需要传递哪些参数给 SHOW_WINDOW 函数,才能从任务栏中移除一个属于另一个进程的顶级窗口,但不会使它最小化或隐藏? - David Heffernan

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接