2010-04-12 1 views
5

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

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

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

EDIT: Ну, это было легче, чем я думал, что это будет, хотя это не совсем то, что я хочу. Как только я передал дескриптор 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); 
    } 
} 
+0

Что произойдет, если вы скроете окно? (I.e., вызов ShowWindow (hwnd, SW_HIDE) –

+0

Элемент панели задач исчезает. –

ответ

4

Хитрость заключалась в том, чтобы установить стиль окна 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));