2010-04-12 8 views
5

Meine Anwendung soll fast vollständig durch eine Windows 7 Taskleiste Element mit der Verwendung von Miniaturansichten und Sprunglisten funktionieren. Ich weiß, ich kann leicht ein Form erstellen und es einfach verstecken, aber das scheint wie Overkill. Außerdem möchte ich so viel wie möglich mit NativeWindow herumspielen, weil ich es vorher nie benutzt habe.Zeigen Sie eine Taskleiste Element mit einem NativeWindow

Im Wesentlichen habe ich eine Klasse namens RootWindow, die von NativeWindow abgeleitet ist, die Hotkeys und hoffentlich alles andere behandeln wird. Ich brauche überhaupt kein sichtbares Fenster, sondern einfach etwas, um Fenstermeldungen zu verarbeiten und ein Taskleistenelement bereitzustellen, an das ich Thumbnails und Sprunglisten anhängen kann.

Gibt es eine spezielle CreateParams Option, die ich an CreateHandle weitergeben muss? Oder habe ich kein Glück?

EDIT: Nun, es war einfacher als ich dachte, obwohl es nicht genau das ist, was ich will. Sobald ich die NativeWindow Handle an die API ShowWindow übergeben, erschien die Taskleiste Element. Es wird jedoch auch ein Fenster in der oberen linken Ecke des Bildschirms angezeigt. Gibt es eine Möglichkeit, dieses Fenster zu entfernen, während das Taskleistenobjekt angezeigt wird?

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

Was passiert, wenn Sie das Fenster ausblenden? (Z. B. ShowWindow (hwnd, SW_HIDE)) –

+0

Das Taskleistenelement verschwindet. –

Antwort

4

Der Trick bestand darin, den Stil des Fensters auf WS_POPUP zu setzen.

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

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

ShowWindow(Handle, SW_SHOWNOACTIVATE); 

Ich deaktivierte auch Aero Peek für das Fenster, da es nur für Hintergrundarbeit ist.

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

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