简体   繁体   English

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

[英]Hide an external application from taskbar

I've looked through many different forums and I cannot find a way. 我看过很多不同的论坛,但我找不到办法。 I am looking to hide external application icons from the taskbar, but not have the application minimized. 我想从任务栏隐藏外部应用程序图标,但没有最小化应用程序。 I have no clue where to start, or how to do it. 我不知道从哪里开始,或者怎么做。 Any help would be greatly appreciated. 任何帮助将不胜感激。

NOTE Hide external application icon, not my form's icon. 注意隐藏外部应用程序图标,而不是我的表单图标。

You can do this with the ShowWindow function. 您可以使用ShowWindow函数执行此操作。 Here is a small sample, that will hide a running "calc.exe" from your taskbar. 这是一个小样本,它将隐藏任务栏中正在运行的“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();
    }
}

There is no really easy way to do this. 没有非常简单的方法可以做到这一点。 The ways to have a top-level window not appear in the taskbar are: 使顶层窗口不显示在任务栏中的方法有:

  1. Make it owned by another window. 让它由另一个窗口拥有。 You cannot do this because the owner is determined at window creation time. 您无法执行此操作,因为所有者是在窗口创建时确定的。
  2. Give it the WS_EX_TOOLWINDOW extended window style. 为它提供WS_EX_TOOLWINDOW扩展窗口样式。 You can do this, but it will alter the appearance of the window. 你可以这样做,但它会改变窗口的外观。
  3. Call ITaskbarList::DeleteTab passing the window handle. 调用ITaskbarList::DeleteTab传递窗口句柄。 Whilst this will work, I believe that in some scenarios, the taskbar button will return. 虽然这会起作用,但我相信在某些情况下,任务栏按钮会返回。

Essentially, what you are attempting to do is against the rules. 从本质上讲,你试图做的是违反规则。 Don't be surprised if the system doesn't make it easy for you to tamper with other applications. 如果系统不易使您篡改其他应用程序,请不要感到惊讶。

The Form class offers the ShowInTaskbar property. Form类提供ShowInTaskbar属性。 Set it to false, preferably in the constructor after InitializeComponent and the winform application will not be shown in the windows taskbar. 将其设置为false,最好在InitializeComponent之后的构造函数中,并且winform应用程序将不会显示在Windows任务栏中。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM