ID do 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 automaçã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 | Recolher tudo

Sumário

Este artigo demonstra como obter o identificador da janela de um aplicativo do Office com o Microsoft Foundation Classes (MFC) ao automatizar esse aplicativo do Visual C++.

Mais Informações

Os modelos de objeto para a maioria dos aplicativos do Microsoft Office não expõem propriedades para recuperar as alças de janela do aplicativo. Para determinar o identificador da janela de um aplicativo do Office que você estiver automatizando, você pode usar a função FindWindow API com o nome de classe para a janela do aplicativo mais alto. Se o aplicativo puder ter várias instâncias em execução ao mesmo tempo, em seguida, talvez seja necessário compensar isso para que você recuperar o identificador de janela correto. As seções a seguir ilustram as técnicas que você pode usar para recuperar o identificador de janela para ambos os aplicativos de instância única e vários.

Observação Modelo de objeto do Microsoft Access expõe a função hWndAccessApp para o objeto _Application para determinar o identificador de janela para o aplicativo. Além disso, o Microsoft Excel 2002 é a primeira versão do Excel para apresentar uma propriedade hWnd para seu objeto Application . Com relação ao Microsoft Excel 2002 e o Microsoft Access versões 97 e posteriores, porque esses aplicativos do Office fornecem um meio por meio de seus modelos de respectivo objeto para recuperar o identificador de janela para o aplicativo, a abordagem de FindWindow discutida neste artigo não é necessária.

Localizar o identificador de janela para um aplicativo que é uma instância

As etapas a seguir ilustram como você pode usar a função FindWindow com um cliente do Visual C++ Automation para determinar o identificador de janela para um servidor de automação fora do processo que pode ter apenas uma única instância. Essa é a técnica que seria empregar ao usar o Microsoft PowerPoint como seu servidor de automação.

exemplo passo a passo
  1. Crie um novo projeto MFC EXE dialog-based.
  2. Adicione um botão para sua caixa de diálogo e um manipulador de BN_CLICKED para ele.
  3. Abrir ClassWizard (CTRL+W), clique na guia de automação , clique em Add Class e selecione de uma biblioteca de tipos .
  4. Vá para o diretório onde você instalou o Office (por exemplo, C:\Program Files\Microsoft Office\Office) e escolha Msppt9.olb .
  5. Selecione todas as classes ClassWizard localiza e clique em OK para retornar ao seu projeto. ClassWizard gerou automação de algumas classes de wrapper do PowerPoint biblioteca de tipos e criou os arquivos Msppt9.h e Msppt9.cpp .
  6. Adicione o seguinte código para o manipulador do 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 seguintes linhas apenas antes de implementar o manipulador do 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. Compile e execute o programa. Clique em botão e observe que o PowerPoint inicia uma apresentação de slide único e fecha para baixo em 15 segundos.

Localizar o identificador de janela para um aplicativo que pode ter várias instâncias

Alguns aplicativos, como o Microsoft Excel ou Microsoft Word, podem ter várias instâncias em execução ao mesmo tempo. Para recuperar o identificador para a instância do aplicativo que você estiver automatizando, primeiro você pode usar automação para alterar o título de um aplicativo como um valor exclusivo e, em seguida, usar FindWindow para recuperar seu identificador de janela. As seguintes etapas ilustram essa técnica usando o Microsoft Excel como o servidor de automação.

exemplo passo a passo
  1. Crie um novo projeto MFC EXE dialog-based.
  2. Adicione um botão para sua caixa de diálogo e um manipulador de BN_CLICKED para ele.
  3. Abrir ClassWizard (CTRL+W), clique na guia de automação , clique em Add Class e selecione de uma biblioteca de tipos .
  4. Vá para o diretório onde você instalou o Office (por exemplo, C:\Program Files\Microsoft Office\Office) e escolha Excel9.olb .
  5. Selecione todas as classes ClassWizard localiza e, em seguida, clique em OK para voltar ao seu projeto. ClassWizard tem gerado algumas classes de invólucro da automação de biblioteca de tipos do Excel e criou arquivos excel9.h e excel9.cpp .
  6. Adicione o seguinte código para o manipulador do 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 seguintes linhas apenas antes de implementar o manipulador do 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. Compile e execute o programa. Clique no botão e observe que o Excel é iniciado e a caixa de mensagem será exibida indicando que o identificador de janela obtido é usado na API ShowWindow como um exemplo. Clique em OK para fechar a caixa de mensagem e saia do Excel.

Referências

Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
178749  (http://support.microsoft.com/kb/178749/ ) Como criar projeto de automação usando MFC e uma biblioteca de tipos
183009  (http://support.microsoft.com/kb/183009/ ) Como o Windows Enumerate usando a API do Win32
179706  (http://support.microsoft.com/kb/179706/ ) Como MFC para usar para automatizar o Excel e criar/formato uma nova pasta de trabalho

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )