Показать элемент панели задач с NativeWindow - PullRequest
5 голосов
/ 12 апреля 2010

Мое приложение предназначено для работы почти полностью через элемент панели задач Windows 7 с использованием миниатюр и списков переходов. Я знаю, что могу легко создать Form и просто скрыть его, но это кажется излишним. Кроме того, я бы хотел поиграть с NativeWindow как можно больше, потому что я никогда не использовал его раньше.

По сути, у меня есть класс с именем RootWindow, производный от NativeWindow, который будет обрабатывать горячие клавиши и, надеюсь, все остальное. Мне вообще не нужно видимое окно, а просто что-то для обработки оконных сообщений и предоставления элемента панели задач, к которому я могу прикрепить миниатюры и списки переходов.

Есть ли какая-то особая опция CreateParams, которую мне нужно передать на CreateHandle? Или мне не повезло?

РЕДАКТИРОВАТЬ: Ну, это было проще, чем я думал, что будет, хотя это не совсем то, что я хочу. Как только я передал дескриптор NativeWindow API ShowWindow, появился элемент панели задач. Тем не менее, он также показывает окно в верхнем левом углу экрана. Есть ли способ избавиться от этого окна, пока еще отображается элемент панели задач?

public class RootWindow : NativeWindow {
    public const int SW_SHOWNOACTIVATE = 4;

    [DllImport("User32.dll")]
    private static extern int ShowWindow(IntPtr hWnd, short cmdShow);

    public RootWindow() {
            CreateHandle(new CreateParams());
            ShowWindow(this.Handle, SW_SHOWNOACTIVATE);
    }
}

1 Ответ

4 голосов
/ 16 апреля 2010

Хитрость заключалась в том, чтобы установить стиль окна на WS_POPUP.

const int WS_POPUP = unchecked((int)0x80000000);
const int SW_SHOWNOACTIVATE = 4;

CreateHandle(new CreateParams() {
    Style = WS_POPUP
});

ShowWindow(Handle, SW_SHOWNOACTIVATE);

Я также отключил Aero Peek для окна, так как он только для фоновой работы.

const int DWMNCRP_ENABLED = 2;
const int DWMWA_DISALLOW_PEEK = 11;

int policy = DWMNCRP_ENABLED;
DwmSetWindowAttribute(Handle, DWMWA_DISALLOW_PEEK, ref policy, sizeof(int));
...