Identificativo articolo: 302295 - Ultima modifica: mercoledì 31 gennaio 2007 - Revisione: 8.2

Ottenere l'handle di finestra per un server di automazione di Office con Visual C# .NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I302295
Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene illustrato come ottenere l'handle di finestra di un'applicazione di Microsoft Office mentre si automatizza tale applicazione da Microsoft Visual C# .NET.

Informazioni

I modelli di oggetti per la maggior parte delle applicazioni di Microsoft Office non espongono proprietà per recuperare gli handle di finestra delle applicazioni. Per determinare l'handle di finestra di un'applicazione di Office che si sta automatizzando, è possibile utilizzare la funzione FindWindow con il nome di classe della finestra superiore dell'applicazione. Se è possibile eseguire più istanze dell'applicazione contemporaneamente, sarà necessario tenere conto di tale aspetto per poter recuperare l'handle di finestra corretto. Nelle sezioni seguenti sono illustrate le tecniche per recuperare l'handle di finestra per applicazioni a istanza singola o multipla.

Nota Il modello di oggetti di Microsoft Access espone la proprietà hWndAccessApp per l'oggetto Application che consente di determinare l'handle di finestra dell'applicazione. È inoltre possibile utilizzare la proprietà hWnd di maschere e report per recuperare gli handle specifici di tali finestre. In Excel 2002 è stata inoltre introdotta per la prima volta una proprietà hWnd per l'oggetto Application. Per quanto riguarda Excel 2002 e Access 97 e versioni successive, poiché queste applicazioni di Office consentono di recuperare l'handle di finestra dell'applicazione mediante i rispettivi modelli di oggetti, l'approccio FindWindow discusso in questo articolo non è necessario.

Individuazione dell'handle di finestra per un'applicazione a istanza singola

Nella procedura descritta di seguito viene illustrato come utilizzare la funzione FindWindow con un client di automazione di Visual C# al fine di determinare l'handle di finestra per un server di automazione out-of-process che consente l'esecuzione di una sola istanza. Questa è la tecnica che viene impiegata utilizzando Microsoft PowerPoint come server di automazione.

Procedura di esempio
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere Nuovo dal menu File, quindi Progetto. Selezionare Applicazione per Windows dai tipi di progetto di Visual C#. Per impostazione predefinita, verrà creato il progetto Form1.
  3. Aggiungere un riferimento alla Libreria oggetti di Microsoft PowerPoint. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Scegliere Aggiungi riferimento dal menu Progetto.
    2. Nella scheda COM individuare la Libreria oggetti di Microsoft PowerPoint, quindi scegliere Seleziona.

      Nota Microsoft Office 2003 include gli assembly di interoperabilità primari (PIA, Primary Interop Assembly). Non sono invece inclusi in Microsoft Office XP, ma possono essere scaricati. Per ulteriori informazioni sugli assembly di interoperabilità primari di Office XP, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
      328912  (http://support.microsoft.com/kb/328912/ ) Assembly di interoperabilità primari (PIA) di Microsoft Office XP disponibili per il download
    3. Scegliere OK nella finestra di dialogo Aggiungi riferimento per accettare le selezioni.
  4. Scegliere Casella degli strumenti dal menu Visualizza per visualizzare la casella degli strumenti, quindi aggiungere un pulsante al form.
  5. Premere F7 per visualizzare la finestra del codice di Form1.
  6. Aggiungere la direttiva seguente all'elenco di direttive using definite nella parte superiore della finestra del codice:
     using System.Runtime.InteropServices;
     using PowerPoint = Microsoft.Office.Interop.PowerPoint;
  7. Aggiungere il codice seguente dopo le definizioni delle direttive:
     public class MyApi
     {
                 [DllImport("user32.dll")]
                 public static extern int FindWindow(string strclassName, string strWindowName); 
     };
  8. Aggiungere il seguente codice all'evento Click di Button1:
    int hwndPPt;
    PowerPoint.Application pptApp;
    
    pptApp = new PowerPoint.Application();
    
    pptApp.Visible  = Microsoft.Office.Core.MsoTriState.msoTrue;
    
    hwndPPt = MyApi.FindWindow("PP10FrameClass",null);
    
    MessageBox.Show("hwndPPt (0x" + hwndPPt.ToString("x") + 
    	") has a Window handle to PowerPoint's main Window. " + "\r\n" + 
    	"Click OK to close Powerpoint" , "Handle for PowerPoint");
    
    pptApp.Quit();
    
    					
    Nota "PP10FrameClass" è il nome della classe per la finestra dell'applicazione Microsoft PowerPoint 2002. Se si sta automatizzando Microsoft Office PowerPoint 2003, modificare il nome della classe nel codice in "PP11FrameClass".
  9. Premere F5 e fare clic su Button1 per eseguire l'esempio.

Individuazione dell'handle di finestra per un'applicazione a istanze multiple

Alcune applicazioni, ad esempio Microsoft Excel o Microsoft Word, consentono l'esecuzione di più istanze contemporaneamente. Per recuperare l'handle di finestra dell'istanza dell'applicazione che si sta automatizzando, è possibile innanzitutto utilizzare l'automazione per cambiare il titolo all'applicazione specificando un valore univoco e quindi utilizzare la funzione API FindWindow per recuperare l'handle di finestra corretto. La procedura descritta di seguito illustra questa tecnica utilizzando Excel come server di automazione.

Procedura di esempio
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere Nuovo dal menu File, quindi Progetto. Selezionare Applicazione per Windows dai tipi di progetto di Visual C#. Per impostazione predefinita, verrà creato il progetto Form1.
  3. Aggiungere un riferimento alla Libreria di oggetti di Microsoft Excel. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Scegliere Aggiungi riferimento dal menu Progetto.
    2. Nella scheda COM individuare Libreria oggetti di Microsoft Excel, quindi scegliere Seleziona.

      Nota Microsoft Office 2003 include gli assembly di interoperabilità primari (PIA, Primary Interop Assembly). Non sono invece inclusi in Microsoft Office XP, ma possono essere scaricati. Per ulteriori informazioni sugli assembly di interoperabilità primari di Office XP, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
      328912  (http://support.microsoft.com/kb/328912/ ) Assembly di interoperabilità primari (PIA) di Microsoft Office XP disponibili per il download
    3. Scegliere OK nella finestra di dialogo Aggiungi riferimento per accettare le selezioni.
  4. Scegliere Casella degli strumenti dal menu Visualizza per visualizzare la casella degli strumenti, quindi aggiungere un pulsante al form.
  5. Premere F7 per visualizzare la finestra del codice di Form1.
  6. Aggiungere la direttiva seguente all'elenco di direttive using definite nella parte superiore della finestra del codice:
     using System.Runtime.InteropServices;
     using Excel = Microsoft.Office.Interop.Excel;
  7. Aggiungere il codice seguente dopo le definizioni delle direttive:
    public class MyApi
    {
    	    [DllImport("user32.dll")] 
    	    public static extern int FindWindow(string strclassName, string strWindowName);
    	
    };
    					
  8. Aggiungere il codice seguente all'evento Click di Button1:
    int hwndExcel;
    
    Excel.Application  xlapp;
    
    xlapp = new Excel.Application();
    
    xlapp.Visible = true;
    
    xlapp.Caption = "Some Caption For Excel Window";
    
    hwndExcel = MyApi.FindWindow("XLMAIN",xlapp.Caption);
    
    xlapp.Caption = null;
    
    MessageBox.Show("hwndExcel (0x" + hwndExcel.ToString("x") + 
    	") has a Window handle to Excel's main Window." + "\r\n" +  
    	"Click OK to close Excel"  , "Handle for Excel");
    
    xlapp.Quit();
  9. Premere F5 e fare clic su Button1 per eseguire l'esempio.

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx (http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx)
Per ulteriori informazioni sul recupero dell'handle di finestra per un server di automazione di Office con versioni precedenti di Visual Basic .NET, fare clic sul seguente numero dell'articolo della Microsoft Knowledge Base:
302281  (http://support.microsoft.com/kb/302281/ ) How to Ottenere l'handle di finestra per un server di automazione di Office con Visual Basic .NET

Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
Chiavi: 
kbpia kbautomation kbhowto KB302295
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.
 

Traduzione articoli