2010-04-12 11 views
5

La mia applicazione è progettata per funzionare quasi interamente attraverso un elemento della barra delle applicazioni di Windows 7 con l'uso di miniature e jump list. So che posso creare facilmente un Form e semplicemente nasconderlo, ma questo sembra eccessivo. Inoltre, mi piacerebbe giocare con lo NativeWindow il più possibile, perché non l'ho mai usato prima.Mostra una voce della barra delle applicazioni con una finestra nativa

In sostanza, ho una classe chiamata RootWindow che deriva da NativeWindow che gestirà i tasti di scelta rapida e, si spera, tutto il resto. Non ho bisogno di una finestra visibile, ma semplicemente qualcosa per elaborare i messaggi della finestra e fornire un elemento della barra delle applicazioni a cui posso allegare miniature e jump list.

Esiste qualche tipo di opzione speciale CreateParams Devo passare a CreateHandle? O sono sfortunato?

EDIT: Beh, è ​​stato più facile di quanto pensassi, anche se non è esattamente quello che voglio. Una volta passato l'handle di NativeWindow all'API ShowWindow, veniva visualizzato l'elemento della barra delle applicazioni. Tuttavia, mostra anche una finestra nell'angolo in alto a sinistra dello schermo. C'è un modo per sbarazzarsi di quella finestra mentre mostra ancora l'elemento della barra delle applicazioni?

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

Cosa succede se si nasconde la finestra? (Ad esempio, chiama ShowWindow (hwnd, SW_HIDE) –

+0

L'elemento della barra delle applicazioni scompare. –

risposta

4

Il trucco era impostare lo stile della finestra su WS_POPUP.

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

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

ShowWindow(Handle, SW_SHOWNOACTIVATE); 

Ho anche disabilitato Aero Peek per la finestra, poiché è solo per lavoro in background.

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

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