Artigo: 261997 - Última revisão: sábado, 27 de Janeiro de 2007 - Revisão: 7.7

Como obter o identificador de janela para um servidor de automatização do Office com MFC

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo demonstra como obter o identificador de janela de uma aplicação do Office com o Microsoft Foundation Classes (MFC) ao automatizar essa aplicação de Visual C++.

Mais Informação

Os modelos de objecto para a maior parte das aplicações do Microsoft Office não expõem propriedades para obter os identificadores de janela de aplicação. Para determinar o identificador de janela da aplicação do Office que estiver a automatizar, pode utilizar a função FindWindow API com o nome da classe para a janela da aplicação mais. Se a aplicação pode ter várias instâncias em execução ao mesmo tempo, em seguida, poderá ser necessário compensar este para que obter o identificador de janela correctas. As secções abaixo ilustram técnicas que pode utilizar para obter o identificador de janela para ambas as aplicações de instância única e vários.

Nota O modelo de objectos do Microsoft Access expõe a função hWndAccessApp para o objecto _Application para determinar o identificador de janela para a aplicação. Além disso, o Microsoft Excel 2002 é a primeira versão do Excel para apresentar uma propriedade hWnd respectivo objecto de aplicação . Relativamente ao Microsoft Excel 2002 e o Microsoft Access 97 e versões posteriores, uma vez que estas aplicações do Office fornecem um meio através dos respectivos modelos respectivo objecto para obter o identificador de janela para a aplicação, a abordagem FindWindow referida neste artigo não é necessária.

Localizar o identificador de janela para uma aplicação de instância única

Os seguintes passos ilustram como pode utilizar a função FindWindow com um cliente de automatização do Visual C++ para determinar o identificador de janela para um servidor de automatização de fora de processo que pode ter apenas uma única instância. Esta é a técnica que iria utilizar quando utilizar o Microsoft PowerPoint como servidor de automatização.

exemplo passo a passo
  1. Crie um novo projecto de MFC EXE baseado no diálogo.
  2. Adicione um botão para a caixa de diálogo e um processador de BN_CLICKED para o mesmo.
  3. Abrir ClassWizard (CTRL+W), clique no separador automatização , clique em Adicionar classe e seleccionar a partir de uma biblioteca de tipos .
  4. Vá para o directório onde instalou o Office (por exemplo, C:\Program Files\Microsoft Office\Office) e escolha Msppt9.olb .
  5. Seleccione todas as classes ClassWizard localiza e clique em OK para voltar ao projecto. ClassWizard gerou alguns automatização classes de moldagem a partir do PowerPoint escreva biblioteca e ficheiros Msppt9.h e Msppt9.cpp criados.
  6. Adicione o seguinte código ao processador botão:
    	
    // Start PowerPoint
    _Application app;
    COleException e;
    if(!app.CreateDispatch("PowerPoint.Application", &e)) {
    	CString str;
    	str.Format("CreateDispatch() failed w/err 0x%08lx", e.m_sc),
    		AfxMessageBox(str, MB_SETFOREGROUND);
    	return;
    }
    	
    // Get Presentations collection and add a new presentation.
    Presentations presSet(app.GetPresentations());
    _Presentation pres(presSet.Add(TRUE));
    	
    // Get Slides collection and add a new slide.
    Slides slideSet(pres.GetSlides());
    _Slide slide1(slideSet.Add(1, 2));
    	
    // Add text to slide, by navigating the slide as follows:
    // slide1.shapes(#).TextFrame.TextRange.Text
    {
    	Shapes shapes(slide1.GetShapes());
    	Shape shape(shapes.Item(COleVariant((long)1)));
    	TextFrame textFrame(shape.GetTextFrame());
    	TextRange textRange(textFrame.GetTextRange());
    	textRange.SetText("Window Handle of PowerPoint Application");
    	}
    
    // Get the Window Handle
    HWND hWndPpt = ::FindWindow ("PP9FrameClass", NULL);
    
    ::ShowWindow (hWndPpt, SW_SHOWNORMAL);
    // You can make the application visible using:
    // app.SetVisible(TRUE);
    // Here ShowWindow API is used to demonstrate the use of 
    // the Window Handle got from FindWindow<BR/>
           ::MessageBox(NULL, "Now displaying PPT using the ShowWindow API", "", MB_SETFOREGROUND);
    
    {
    
    		Shapes shapes(slide1.GetShapes());
    		Shape shape(shapes.Item(COleVariant((long)2)));
    		TextFrame textFrame(shape.GetTextFrame());
    		TextRange textRange(textFrame.GetTextRange());
    		textRange.SetText("hWndPpt contains the Window Handle of the PowerPoint application.  You can "
    					"use this Window Handle in various Win 32 APIs, such as SetForeGroundWindow, "
    					"which require a Window Handle parameter to be supplied.\r\n"
    					"This example uses the Window Handle in the ShowWindow API.\r\n\r\n"
    
    					"All done.  PowerPoint will close in 15 seconds.");
    	}
    
    
    // Prepare and run a slide show.
    {
    	 SlideShowSettings sss(pres.GetSlideShowSettings());
    	 sss.SetShowType(3); // Kiosk.
    	 sss.SetLoopUntilStopped(TRUE);
             sss.SetRangeType(1); // Show all.
    	 sss.SetAdvanceMode(2); // Use slide timings.
    	 SlideShowWindow ssw(sss.Run()); // Run show.
    }
    
    // Sleep so user can watch slide show.
    ::Sleep(15000);
    
    // Tell PowerPoint to quit.
    app.Quit(); 	
    					
  7. Adicione as linhas seguintes antes de implementar o processador de botão:
    #include "msppt9.h"
    
    // Ole initialization class.
    class OleInitClass {
    public:
       OleInitClass() {
    	  OleInitialize(NULL);
       }
       ~OleInitClass() {
    	  OleUninitialize();
       }
    };
    // This global class calls OleInitialize() at
    // application startup, and calls OleUninitialize()
    // at application exit.
    OleInitClass g_OleInitClass; 
    					
  8. Compilar e executar o programa. Clique no botão e note que o PowerPoint inicia uma apresentação de diapositivo e fecha-se para baixo dentro de 15 segundos.

Localizar o identificador de janela para uma aplicação que pode ter várias instâncias

Algumas aplicações, tal como o Microsoft Excel ou Microsoft Word, podem ter várias instâncias em execução ao mesmo tempo. Para obter o identificador da instância da aplicação que estiver a automatizar, pode utilizar primeiro Automation para alterar o título de uma aplicação para um valor exclusivo e utilize FindWindow para obter o identificador de janela. Os seguintes passos ilustram esta técnica utilizando o Microsoft Excel como o servidor de automatização.

exemplo passo a passo
  1. Crie um novo projecto de MFC EXE baseado no diálogo.
  2. Adicione um botão para a caixa de diálogo e um processador de BN_CLICKED para o mesmo.
  3. Abrir ClassWizard (CTRL+W), clique no separador automatização , clique em Adicionar classe e seleccionar a partir de uma biblioteca de tipos .
  4. Vá para o directório onde instalou o Office (por exemplo, C:\Program Files\Microsoft Office\Office) e escolha Excel9.olb .
  5. Seleccione todas as classes ClassWizard localiza e, em seguida, clique em OK para regressar ao projecto. ClassWizard tem gerados algumas classes de moldagem automatização da biblioteca de tipo Excel e criar ficheiros excel9.h e excel9.cpp .
  6. Adicione o seguinte código ao processador botão:
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    	
    _Application app;
    
    Workbooks books;
    _Workbook book;
    Worksheets sheets;
    _Worksheet sheet;
    	
    // Start Excel and get Application object.
    if(!app.CreateDispatch("Excel.Application"))
    {
    	AfxMessageBox("Couldn't start Excel and get Application object.");
    		return;
    }
    	
    
    //Get a new workbook.
    books = app.GetWorkbooks();
    book = books.Add (covOptional);
    	
    app.SetCaption ("New Caption Supplied by Program");
    	
    // Get the Window Handle
    HWND hWndXL = ::FindWindow ("XLMAIN", app.GetCaption ());
    	
    // Set the original caption back
    app.SetCaption ("");
    	
    ::ShowWindow (hWndXL, SW_SHOWNORMAL);
    // You can make the application visible using:
    // app.SetVisible(TRUE);
    // Here ShowWindow API is used to demonstrate the use of 
    // the Window Handle got from FindWindow
    	
    AfxMessageBox ("hWndXL contains the Window Handle of the Excel application.  You can use\n"
    	"this Window Handle in various Win 32 APIs, such as SetForeGroundWindow,\n"
    	"which require a Window Handle parameter to be supplied.\n\n"
    	"This example uses the Window Handle in the ShowWindow API.\n\n"
    	"All done.  Press OK to close Excel.", MB_SETFOREGROUND);
    	
    // Tell Excel to quit.
    app.Quit();
    					
  7. Adicione as linhas seguintes antes de implementar o processador de botão:
    #include "excel9.h"
    
    // Ole initialization class.
    class OleInitClass {
    public:
    	  OleInitClass() {
    		 OleInitialize(NULL);
    	  }
    	  ~OleInitClass() {
    		  OleUninitialize();
    	  }
    };
    // This global class calls OleInitialize() at
    // application startup, and calls OleUninitialize()
    // at application exit.
    OleInitClass g_OleInitClass; 
    					
  8. Compilar e executar o programa. Clique no botão e note que o Excel é iniciado e é apresentada uma caixa de mensagem indicando que é utilizado o identificador de janela obtido um exemplo na API ShowWindow. Clique em OK para fechar a caixa de mensagem e saia do Excel.

Referências

Para obter informações adicionais, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
178749  (http://support.microsoft.com/kb/178749/ ) Como criar projecto de automatização utilizando MFC e uma biblioteca de tipos
183009  (http://support.microsoft.com/kb/183009/ ) Como Enumerate Windows utilizando a API do Win32
179706  (http://support.microsoft.com/kb/179706/ ) Como para MFC de utilizar para automatizar o Excel e criar/formatar um novo livro

A informação contida neste artigo aplica-se a:
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
Palavras-chave: 
kbmt kbautomation kbhowto KB261997 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 261997  (http://support.microsoft.com/kb/261997/en-us/ )