Come aggiungere una finestra accanto al riquadro di anteprima in Outlook

Traduzione articoli Traduzione articoli
Identificativo articolo: 982758 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Introduzione

In questo articolo viene descritto come utilizzare un componente aggiuntivo per aggiungere una finestra accanto al riquadro di anteprima in Microsoft Outlook. Questo metodo Ŕ progettato per l'utilizzo con Outlook 2003, Outlook 2007 e Outlook 2010. Dopo che il componente aggiuntivo crea la finestra, il componente aggiuntivo pu˛ chiamare API Windows nella finestra esattamente come qualsiasi altro handle di finestra (HWND).á

Informazioni

Questo articolo fornisce esempi di codice e documentazione correlata. Per scaricare questo contenuto, visitare il seguente sito Web MSDN:

http://code.msdn.Microsoft.com/OlAdjacentWindows
ImportanteIntegrazione Windows API (HWND) in Outlook non Ŕ una piattaforma supportata tecnologia.

Ŕ comprendere che i clienti giÓ utilizza l'approccio di Windows API per l'integrazione con Outlook e Outlook Connector sociali anche sfrutta questo tipo di integrazione. Documentazione di finestre adiacenti in Outlook fornisce linee guida "procedure ottimali" per evitare conflitti con altri programmi che utilizzano questo approccio, inclusi il connettore Outlook sociali.

Questo codice di esempio e la documentazione corrispondente non sono supportati da Microsoft. Il gruppo di prodotti Outlook non prende in considerazione questo approccio complessivo da parte dell'architettura supportati da Outlook in termini di sviluppo di soluzioni personalizzate con Outlook. Si consiglia invece di utilizzare altri metodi che sono stati pi¨ completamente progettati, testati e documentati per l'utilizzo con Outlook. A seconda della versione di Outlook, questi altri approcci includono moduli personalizzati di Outlook, le aree del modulo, home page delle cartelle, i riquadri attivitÓ personalizzati e l'architettura di estendibilitÓ di Outlook Connector (OSCHOOSER sociali). Uno dei vantaggi principali dell'utilizzo di questi metodi supportati Ŕ che gli sviluppatori avranno molto maggiori possibilitÓ che non si verificheranno problemi di compatibilitÓ quando una versione pi¨ recente o rilascio di service pack di Outlook.á

Se si verificano problemi quando si utilizzano le informazioni fornite nel codice di esempio, Ŕ possibile registrare commenti nella pagina MSDN Code Gallery per questo download. Tuttavia, non Ŕ possibile garantire che verrÓ fornito supporto per problema.

Definizioni

Riduci questa tabellaEspandi questa tabella
Finestra di livello superioreHandle di finestra the Outlook associato al desktop. Questa Ŕ la cornice contenente la finestra o la finestra di controllo.
Finestra di pari livelloNella finestra Esplora risorse, questo Ŕ il riquadro di anteprima. Nella finestra del controllo, si tratta della finestra che contiene l'area client delle finestre controllo (oltre al corpo dell'intestazione posta). La finestra adiacente Ŕ posizionata accanto alla finestra di pari livello.
Finestra adiacenteLa finestra del componente aggiuntivo creato accanto al riquadro anteprima o accanto alla finestra del controllo.
Esplora risorseFinestra principale di Outlook che contiene il riquadro di spostamento, l'elenco dei messaggi e il riquadro di anteprima, per esempio.
ControlloOutlook una finestra che visualizza un elemento specifico, ad esempio posta elettronica o appuntamenti.
Outlook legacyIn outlook 2003 e Outlook 2007. In questo articolo queste versioni vengono chiamatelegacyperchÚ la relativa gerarchia HWND Ŕ diverso da quello di Outlook 2010.

Prerequisiti

Il componente aggiuntivo deve avere un meccanismo per eseguire attivitÓ quando sono inattive. Ad esempio, pu˛ farlo creando una finestra nascosta che riceve messaggi WM_TIMER. Infatti, WM_TIMER Ŕ un messaggio con prioritÓ bassa che viene eseguita quando non sono presenti messaggi di prioritÓ superiori per l'elaborazione. Vedere ilIdlecall.cppfile di download nel sito Web MSDN fornito all'inizio della sezione "Informazioni".

Trovare tutte le istanze di Outlook

IlFindTopLevelWindowsfunzione Cerca tutte le finestre di primo livello (utilizzando ilrctrl_renwnd32Classe messaggio di outlook). Questa funzione viene chiamata quando il componente aggiuntivo viene inizializzato.

Per trovare l'elenco delle cartelle frame della finestra, la funzione attraversa la gerarchia delle finestre della finestra principale per individuare il riquadro di visualizzazione e il riquadro di anteprima (questa funzionalitÓ discrepanze tra le installazioni precedenti di Outlook e Outlook 2010). Vedere ilFindExplorerWindowseFindExplorerWindowsLegacyOutlookfunzioni nel download. In questo caso, se la funzione Ŕ in grado di reperire i riquadri di anteprima e di visualizzazione, viene considerato il riquadro di anteprima della finestra di pari livello.

Se la funzione non si trova nel riquadro di anteprima, tenta di individuare una finestra in cui viene utilizzato ilAfxWndWclasse di messaggio . Si tratta della finestra di pari livello per un controllo finestra.

Se la funzione Trova finestra di pari livello in caso di cartelle o il controllo chiamaFCreateHookedAdjacentWindow. Consente di creare la finestra adiacente. I parametriFCreateHookedAdjacentWindowsonohWndSibling(la finestra di pari livello),hWndParent(padrehWndSibling, che deve essere anche il padre della finestra adiacente), ehWndTopLevelWindow(finestra di primo livello). Oltre a creare una finestraFCreateHookedAdjacentWindowInstalla anche un hook del messaggio (WndProcHookedWindow). ╚ possibile utilizzare questo hook del messaggio per determinare quando il riquadro di anteprima o la finestra di controllo Ŕ stata ridimensionata e quando la finestra adiacente deve pertanto essere regolata anche.

Se un elenco di cartelle si trova finestra, ma non un riquadro di anteprima nell'elenco delle cartelle, questo significa che l'utente ha scelto di non mostrare il riquadro di anteprima.FindExplorerWindowseFindExplorerWindowsLegacyOutlookInstalla un hook del messaggio (WndProcUnhookedWindow) che attende il messaggio WM_PARENTNOTIFY viene inviato quando una finestra figlio viene creato. Quando viene visualizzato questo messaggio, Ŕ possibile chiamareFindTopLevelWindowsper determinare se il riquadro di anteprima Ŕ stato creato.

Ŕ inoltre possibile ascoltare laApplication.NewInspectoreApplication.NewExplorerGli eventi del modello di oggetti di outlook (vedere laConnect.cppfile nel download), quindi chiamare ilFindTopLevelWindowsfunzione nuovamente quando si riceve un messaggio. PoichÚ Outlook invia questi eventi del modello di oggetto prima della corrispondente e handle di finestra del controllo venga effettivamente creato, Ŕ necessario attendere prima di inattivitÓFindTopLevelWindowsviene chiamato tramite il meccanismo di funzione inattivo.

Creare la finestra adiacente e associare l'oggetto del modello di oggetto corrispondente che utilizza questa finestra

IlFMatchWindowToOMObjectfunzione richiede una finestra di primo livello e tenta di associare un oggetto nel modello di oggetti, un elenco di cartelle o un controllo, in questa finestra. La funzione viene eseguita l'iterazione di tutti gli elenchi di cartelle e tutti i controlli mediante la chiamataQueryInterfacesull'oggetto indirizzo del modello di oggetti dell'interfaccia IOleWindow, chiamandoIOleWindow::GetWindowe quindi confrontando l'handle restituito dalla funzione per l'handle della finestra principale. Vedere ilHwndFromIDispatchfunzione.

Messaggio di hook di gestione

Messaggio di hook che si installa (WndProcHookedWindoweWndProcUnhookedWindow) deve rispondere al messaggio WM_REMOVING_WNDPROC. Ad esempio, considerare il seguente scenario:

A aggiuntivo installa un hook del messaggio chiamando SetWindowLong(GWLP_WNDPROC). In tal modo da wndproc precedente. B aggiuntivo installa un hook del messaggio e quindi salvato dal precedente wndproc (installato dal componente aggiuntivo A). Nella tabella seguente viene illustrato il risultato.

Riduci questa tabellaEspandi questa tabella
Installazione wndprocSaved disattivare wndproc precedente
Un componente aggiuntivoWndProcAWndProcO (originale)
B del componente aggiuntivoWndProcBWndProcA

In situazioni tipiche in cui viene sottoposto a override un hook del messaggio, quando viene scaricato un componente aggiuntivo, questo set messaggio hook per WndProcO. E quando B aggiuntivo viene scaricato, in questo modo l'hook del messaggio su WndProcA. Entrambe le azioni sono errate e la seconda azione genera un arresto anomalo se viene scaricato il componente aggiuntivo contenente WndProcA.

Per risolvere questo problema, ogni WndProc descritto in questo articolo deve supportare il messaggio WM_REMOVING_WNDPROC. Scaricamento del componente aggiuntivo e si desidera ripristinare il vecchia WndProc, chiama innanzituttoGetWindowLongPtr(GWLP_WNDPROC)e quindi Confronta WndProc corrente con WndProc Ŕ installato. Se queste istanze WndProc sono uguali, il componente aggiuntivo chiamaSetWindowLongPtr(GWLP_WNDPROC)utilizzando il vecchia WndProc salvata. Se non sono uguali, il componente aggiuntivo invia il messaggio WM_REMOVING_WNDPROC per l'HWND con wParam == il vecchio WndProc e lParam == WndProc sono stati installati. (Vedere laWndProcInfo::Destroyfunzione .) Il valore restituito per l'invio del messaggio WM_REMOVING_WNDPROC siano sempre 1 per segnalare che il messaggio viene gestito. Asserzioni vengono aggiunti nel codice per rilevare se Ŕ stata eseguita questa procedura, per il debug (anche se non c'Ŕ niente aggiuntivo pu˛ fare se il messaggio non Ŕ stato gestito).

Sulla ricezione del messaggio WM_REMOVING_WNDPROC (vedere laFHandleRemovingWndProcfunzione nel download), se lParam == nostro vecchio WndProc si scambia i vecchi WndProc con wParam. Se viene eseguita questa operazione, il WndProc restituisce il valore 1. Se i due valori non corrispondono, il messaggio viene inoltrato come di consueto per il vecchia WndProc tramite CallWindowProc,.

Per esempio: se si esamina la stessa situazione come indicato in precedenza con il componente aggiuntivo A e B aggiuntivo, se scaricare un componente aggiuntivo, invierebbe il messaggio WM_REMOVING_WNDPROC alla finestra con wParam = WndProcO e lParam = WndProcA. PoichÚ il gestore registrato finestra WndProcB, WndProcB sarebbe elaborare prima il messaggio. PoichÚ lParam = WndProcA e il vecchia WndProc memorizzati dal componente-b Ŕ anche WndProcB, quindi impostare il vecchio WndProc WndProcO in B e restituire 1. Un componente aggiuntivo non ha alcuna ulteriore azione. A questo punto, si tratta del diagramma schematico di componente aggiuntivo B:

Riduci questa tabellaEspandi questa tabella
Installazione wndprocVecchio wndproc
B del componente aggiuntivoWndProcBWndProcO

Panoramica dell'hosting di pi¨ finestre adiacenti

Quando pi¨ componenti aggiuntivi intende posizionare accanto al riquadro di anteprima di windows hanno operano congiuntamente in modo che tutte le finestre si verificano in modo ordinato e non si sovrappongono tra loro. A tal fine, il resto di questo articolo viene descritto come posizionare congiuntamente finestre in windows explorer e controllo.

Il codice di esempio introduce il concetto di elenco a doppio collegamento di finestre adiacenti. L'elenco collegato non viene mantenuto da Outlook o da un singolo componente aggiuntivo. Conservare i collegamenti "successivo" e "prev" singolarmente per ogni finestra adiacente. Quando un componente aggiuntivo intende creare una finestra adiacente, aggiunge automaticamente all'inizio dell'elenco collegato (ovvero prev = NULL). All'inizio dell'elenco collegato al controller; si tratta della finestra che indirizza tutte le altre finestre come posizionare stessi. Il controller Ŕ inoltre responsabile dell'ascolto al messaggio WM_WINDOWPOSCHANGING della finestra di pari livello (vedere laWndProcHookedWindowfunzione ).á

La gestione del messaggio WM_WINDOWPOSCHANGING

Il codice di esempio viene installato un hook del messaggio (WndProcHookedWindow) della finestra di pari livello. Lo scopo di gestire il messaggio per finestra di pari livello consiste nel modificare la posizione e le dimensioni quando la finestra viene ridimensionata in modo che lo spazio viene effettuato per finestre adiacenti. Quando si gestisce questo messaggio, il controller richiede tutte le finestre adiacenti (attraverso laGetReservedRectmessaggio dettagliato pi¨ avanti) quanto spazio richiede ogni finestra. Quindi il controller sottrae lo spazio di rect pari livello della finestra (attraverso la struttura WINDOWPOS dal messaggio WM_WINDOWPOSCHANGING) e quindi indica tutte le finestre adiacenti per spostare e delinearne stessi (attraverso laPlaceWindowAdjacentToRectmessaggio ). Vedere ilCAdjacentWindow::SiblingWindowPosChangingfunzione.

La gestione del messaggio WM_NEGOTIATE_WINDOW_PANE

Tutte le finestre adiacenti devono elaborare questo messaggio. Per questo messaggio il parametro wParam Ŕ impostato su un sottocodice inoltre specifica Qual Ŕ il messaggio. Vedere ilCAdjacentWindow::OnNegotiateWindowfunzione . Questo messaggio viene inviato da finestre adiacenti per comunicare tra loro. Il successivo set di sezioni dettaglio subcodes diversi e le operazioni.á

AddCustomWindowToTop

Questo messaggio viene inviato da una nuova finestra adiacente per aggiungersi a un elenco collegato di windows. lParam contiene l'handle di finestra della nuova finestra adiacente. Vedere ilCAdjacentWindow::FindTopMostInjectedPanefunzione per il processo di invio di questo messaggio. La funzione esaminato tutte le finestre figlio dell'elemento padre della finestra di pari livello e quindi la funzione Invia questo messaggio a ogni finestra, a sua volta, finchÚ non riceve un risultato diverso da zero.

Finestre di controller non rispondono a questo messaggio restituendo 0. Il controller risponde al messaggio impostando la finestra "prev" lParam (rendendo non il controller) e restituendo l'handle di finestra. La nuova finestra adiacente deve utilizzare come finestra "successiva" (e la nuova finestra diventa il controller).

Se non vi sono finestre controller esistente, la nuova finestra adiacente diventa il controller.

ReplacePrevWindow

Questo messaggio viene inviato a sostituire il puntatore "prev" con il valore di lParam. Viene utilizzato per gestire l'elenco delle finestre collegata quando vengono scaricate da finestre adiacenti (vedere laCAdjacentWindow::OnDestroyfunzione.)

ReplaceNextWindow

Questo messaggio viene inviato a sostituire il puntatore alla finestra "successiva" con il valore di lParam.

GetReservedRect

Questo messaggio viene inviato a una finestra per determinare la quantitÓ di spazio da riservare per esso. Questo messaggio deve essere inoltrato alla finestra "successiva", se presente. lParam contiene una struttura RECT viene inizializzata su 0,0,0,0 dal chiamante primo. Ogni finestra adiacente aggiunge la struttura del volume di spazio necessaria. Ad esempio una finestra adiacente per essere posizionato sotto il riquadro utenti aggiungere l'altezza desiderata per il valore della parte inferiore. I valori di sinistra, superiore, destro e inferiore non vengono coordinate, ma sono lo spazio totale previsto (vale a dire nessuno di questi valori deve essere negativo).á

PlaceWindowAdjacentToRect

Questo messaggio viene inviato a una finestra adiacente quando la finestra adiacente Ŕ per il posizionamento. lParam contiene una struttura RECT che inizializza il chiamante originale al client RECT della finestra di pari livello. Ogni finestra si posizionerÓ (possibilmente aSetWindowPos), viene modificata la struttura RECT affinchÚ il RECT include ora la finestra adiacente e quindi inoltra il messaggio nella finestra "successiva". Ad esempio, una finestra adiacente per essere posizionato sotto il riquadro di anteprima con altezza CY sarebbe posizionerÓ (rc.left, rc.bottom, rc.right ? rc.left, CY) e quindi regolare la struttura RECT (rc.left, rc.top, rc.right, rc.bottom + CY). Quando tutte le finestre adiacenti sono stati completati i layout, la struttura RECT dovrÓ essere identica al client RECT della finestra padre. L'ultimo l'asserzione diCAdjacentWindow::SiblingWindowPosChangingfunzione verifica che si tratta del caso.

RecalcPaneLayout

Questo messaggio viene inviato a chiedere il controller per eseguire un passaggio di layout completo. Finestre controller non devono inoltrare il messaggio nell'elenco collegato di finestre adiacenti. Il controller (vedere laCAdjacentWindow::RecalcPreviewPaneLayoutControllerfunzione) determina lo spazio disponibile corrente (area client della finestra padre), lo spazio richiesto (inviando un messaggio GetReservedRect), quindi ridimensiona la finestra di pari livello e quindi invia il messaggio PlaceWindowAdjacentToRect per tutte le finestre adiacenti Ŕ proprio layout.

ProprietÓ

Identificativo articolo: 982758 - Ultima modifica: martedý 27 luglio 2010 - Revisione: 2.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Outlook 2010
  • Microsoft Office Outlook 2007
  • Microsoft Office Outlook 2003
Chiavi:á
kbexpertiseinter kbhowto kbsurveynew kbprb kbmt KB982758 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 982758
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com