C#从任务栏隐藏应用程序

Ren*_*ers 12 c# pinvoke spy++

我一直在努力从应用程序中隐藏任务栏中的另一个应用程序.
我一直在使用SetWindowLong函数来设置/删除扩展样式上的WS_EX_APPWINDOW .

我已尝试单独设置和删除属性以及获取当前WindowLong,并删除/添加到该属性,如下所示:

SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & WS_EX_APPWINDOW);
Run Code Online (Sandbox Code Playgroud)

并尝试删除它:

SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & ~WS_EX_APPWINDOW);
Run Code Online (Sandbox Code Playgroud)

在没有先让窗口长的情况下也尝试了这两种方法.这是我的整个代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    [DllImport("User32.dll")]
    public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    [DllImport("User32.dll")]
    public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    private const int SW_HIDE = 0x00;
    private const int SW_SHOW = 0x05;

    private const int WS_EX_APPWINDOW = 0x40000;
    private const int GWL_EXSTYLE = -0x14;

    private void HideWindowFromTaskbar(IntPtr pMainWindow)
    {
        SetWindowLong(pMainWindow, GWL_EXSTYLE, ~WS_EX_APPWINDOW);

        ShowWindow(pMainWindow, SW_HIDE);
        ShowWindow(pMainWindow, SW_SHOW);
    }

    private void ButtonHide_Click(object sender, RoutedEventArgs e)
    {
        HideWindowFromTaskbar(Process.GetProcessesByName("notepad")[0].MainWindowHandle);
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到Spy ++中有关属性的变化.我有一堆不同的结果,比如添加了WS_EX_APPWINDOW,但也随机地让其他属性消失等等.
当看到这些消息时,我也看到它得到了像STYLE_CHANGED这样的消息.

任何帮助将不胜感激,
René

Dav*_*nan 5

MSDN上记录了确定哪些窗口在任务栏上有按钮的规则。Raymond Chen对这些规则进行了以下总结:

关于哪些窗口进入任务栏有一些基本规则。简而言之:

  • 如果设置了 WS_EX_APPWINDOW 扩展样式,那么它将显示(当可见时)。
  • 如果该窗口是顶级无主窗口,则它将显示(当可见时)。
  • 否则不显示。

事实上,您尝试修改另一个应用程序中的窗口会严重阻碍您。您正在删除WS_EX_APPWINDOW扩展样式。这还不够,因为相关窗口将是顶级无主窗口(请参阅要点 2)。一旦创建了窗口,您就无法更改它的所有者,并且由于该窗口是由另一个进程控制的,因此您几乎陷入困境。

剩下的唯一选择是删除WS_EX_APPWINDOW扩展样式并将其替换为WS_EX_TOOLWINDOW. 这确实会使窗口脱离任务栏,但会改变窗口的外观

该窗口旨在用作浮动工具栏。工具窗口的标题栏比普通标题栏短,并且窗口标题使用较小的字体绘制。工具窗口不会出现在任务栏或用户按 ALT+TAB 时出现的对话框中。如果工具窗口有系统菜单,则其图标不会显示在标题栏上。但是,您可以通过右键单击或键入 ALT+SPACE 显示系统菜单。