2009-04-11 19 views
13

Vorrei poter nascondere la finestra di un'altra applicazione dalla barra delle applicazioni, senza nascondere la finestra stessa. Nello specifico, voglio avere diversi browser Web in esecuzione, visibili, disponibili nell'elenco Alt + Tab, ma non occupano spazio sulla barra delle applicazioni.Nascondi il pulsante della barra delle applicazioni di un'altra app

(Se qualcuno è curioso di sapere perchè. Ho scritto un'applicazione dashboard che utilizza DwmRegisterThumbnail API di Vista per mostrare anteprime in tempo reale di diverse finestre contemporaneamente - una sorta di "picture in picture", se si vuole A quel punto, anche avere i pulsanti della barra delle applicazioni per quelle finestre sembra ridondante.)

Sono consapevole del fatto che cambiare lo stile dell'altro finestra per includere WS_EX_TOOLWINDOW lo nasconderà dalla barra delle applicazioni, e ho provato prima questo. Ma, come previsto, ha avuto alcuni effetti collaterali che non volevo: la barra del titolo si è accorciata (non è affatto male, immagino) e i pulsanti minimizza e massimizza sono andati via (non va bene). Ho anche dovuto nascondere e mostrare nuovamente la finestra per far sì che la barra delle applicazioni riconoscesse la modifica, il che ha causato la ridipinta degli artefatti quando l'ho fatto a IE Windows.

Il mio prossimo pensiero è stato che, dal momento che le finestre con i proprietari sono nascoste dalla barra delle applicazioni per impostazione predefinita, forse potrei cambiare le altre finestre di proprietà del mio. Ma MSDN è pretty clear che "[a] fter crea una finestra di proprietà, un'applicazione non può trasferire la proprietà della finestra ad un'altra finestra."

Ho trovato this question che è formulato in modo simile al mio, ma riguarda specificamente Windows dal proprio processo, in cui si ha il controllo completo sulla proprietà della finestra.

Qualcuno sa di altri modi per nascondere un pulsante della barra delle applicazioni, che funzionerà per Windows da un altro processo?


Aggiornamento: Tormod mi ha messo sulla strada giusta con ITaskbarList - funziona benissimo. La pagina pinvoke.net presentava alcuni errori (GUID errato, metodi dichiarati alfabeticamente anziché nell'interfaccia), ma l'ho modificato, ho apportato correzioni e aggiunto un esempio di come istanziare l'ITaskbarList tramite la sua coclasse.

Aggiornamento 2: Se si utilizza DeleteTab di nascondere il pulsante della barra delle applicazioni di una finestra, e poi fare che la finestra attiva (ad esempio tramite SetForegroundWindow o Alt + Tab), il suo pulsante sulla barra delle applicazioni riapparirà. Per mantenere nascosto il pulsante della barra delle applicazioni, ho dovuto aggiungere un timer e continuare a chiamare DeleteTab. Finché non ti preoccupi che il pulsante della barra delle applicazioni riappaia brevemente ogni volta che la finestra viene messa a fuoco, questo funziona bene.

risposta

6

Da MSDN:

versione 4.71 e successiva del Shell32.dll aggiunge la capacità di modificare il contenuto della barra delle applicazioni. Da un'applicazione, ora è possibile aggiungere, rimuovere e attivare i pulsanti della barra delle applicazioni. L'attivazione dell'elemento non attiva la finestra; mostra l'elemento come premuto sulla barra delle applicazioni.

Le funzionalità di modifica della barra delle applicazioni sono implementate in un oggetto COM (Component Object Model) (CLSID_TaskbarList) che espone l'interfaccia ITaskbarList (IID_ITaskbarList). È necessario chiamare il metodo ITaskbarList :: HrInit per inizializzare l'oggetto. È quindi possibile utilizzare i metodi dell'interfaccia ITaskbarList per modificare il contenuto della barra delle applicazioni.

Sembra che l'interoperabilità COM sia la via da percorrere per manipolare in modo affidabile il contenuto della barra delle applicazioni.In particolare, si avrebbe bisogno di chiamare le seguenti funzioni:

È possibile trovare la firma C# per l'interfaccia ITaskbarList a pinvoke.net: ITaskbarList.

+0

Dolce - Non ho mai saputo di questo, ma suona come il biglietto. Grazie! –

0

Hai provato a rimuovere WS_EX_APPWINDOW?

+0

Sì, l'ho fatto. Questo funziona solo se l'altra app ha dovuto aggiungere "WS_EX_APPWINDOW" in primo luogo, ad es. se avesse una finestra del proprietario. Le finestre ordinarie di primo livello non hanno bisogno di 'WS_EX_APPWINDOW', quindi non è lì da rimuovere. –

Problemi correlati