C# Скрытие приложения с панели задач

Мне не удается скрыть другое приложение с панели задач моего приложения.
Я использовал функцию SetWindowLong, чтобы установить/удалить WS_EX_APPWINDOW на расширенном стиле.

Я пробовал как устанавливать и удалять свойство по отдельности, так и брать текущий WindowLong, и удалять/добавлять его к нему, вот так:

SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & WS_EX_APPWINDOW);

И пробовал удалять его вот так:

SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & ~WS_EX_APPWINDOW);

Также пробовал оба этих метода без предварительного получения window long. Вот весь мой код:

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);
    }
}

Я заметил изменения в Spy++, глядя на свойства. У меня была куча разных результатов, например, добавление WS_EX_APPWINDOW, но также случайное исчезновение других атрибутов и т.д.
Просматривая сообщения, я также увидел, что он ДЕЙСТВИТЕЛЬНО получает сообщения типа STYLE_CHANGED.

Любая помощь будет оценена по достоинству,
Рене

12
задан René Sackers 23 November 2011 в 14:27
поделиться