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.
Este artigo demonstra como capturar eventos de aplicativo 97 do Microsoft Word usando o Microsoft Visual C++. No entanto, os conceitos e código neste artigo não são específicas do Microsoft Word; elas são aplicáveis para o conjunto completo de aplicativos do Microsoft Office, bem como qualquer outro aplicativo que expõe eventos.
As etapas a seguir ilustram como criar um MFC aplicativo captura os eventos de aplicativo do Microsoft Word 97 Startup() DocumentChange() e Quit():
Criar um novo diálogo baseado em caixa aplicativo usando o MFC AppWizard. Nomeie o projeto WordEvents e aceitar as configurações padrão.
Adicione dois botões para sua caixa de diálogo e nomeie os botões de "Iniciar e a instalação" e "Fechar e limpar," respectivamente.
Adicione o seguinte código para um manipulador para o botão "Iniciar e a instalação":
// Check to see if you've already started the server.
if(m_app.m_lpDispatch != NULL) {
AfxMessageBox("Server already started.");
return;
}
char buf[256]; // General purpose buffer.
// Start Automation server.
COleException e;
if(!m_app.CreateDispatch("Word.Application.8", &e)) {
sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",
e.m_sc, e.m_sc);
AfxMessageBox(buf, MB_SETFOREGROUND);
return;
}
// Make server visible through automation.
// I.e.: Application.Visible = TRUE
DISPID dispID;
unsigned short *ucPtr;
BYTE *parmStr;
ucPtr = L"visible";
m_app.m_lpDispatch->GetIDsOfNames(
IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
);
parmStr = (BYTE *)( VTS_VARIANT );
m_app.InvokeHelper(
dispID, DISPATCH_METHOD | DISPATCH_PROPERTYPUT, VT_EMPTY,
NULL, parmStr, &COleVariant((short)TRUE)
);
// Declare the events you want to catch.
// {000209F7-0000-0000-C000-000000000046}
static const GUID IID_IWord8AppEvents =
{0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } };
// Steps for setting up events.
// 1. Get server's IConnectionPointContainer interface.
// 2. Call IConnectionPointContainerFindConnectionPoint()
// to find the event you want to catch.
// 3. Call IConnectionPoint::Advise() with the IUnknown
// interface of your implementation of the events.
HRESULT hr;
// Get server's IConnectionPointContainer interface.
IConnectionPointContainer *pConnPtContainer;
hr = m_app.m_lpDispatch->QueryInterface(
IID_IConnectionPointContainer,
(void **)&pConnPtContainer
);
ASSERT(!FAILED(hr));
// Find connection point for events you're interested in.
hr = pConnPtContainer->FindConnectionPoint(
IID_IWord8AppEvents,
&m_pConnectionPoint
);
ASSERT(!FAILED(hr));
// Get the IUnknown interface of your event implementation.
LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown);
ASSERT(pUnk);
// Setup advisory connection!
hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie);
ASSERT(!FAILED(hr));
// Release IConnectionPointContainer interface.
pConnPtContainer->Release();
Adicione o seguinte código um manipulador para o botão "Sair e limpar":
// Check if you've started the server.
if(m_app.m_lpDispatch == NULL) {
AfxMessageBox("You haven't started the server yet.");
return;
}
m_pConnectionPoint->Unadvise(m_adviseCookie);
// Tell server to quit.
// Application.Quit()
DISPID dispID; // Temporary DISPID
unsigned short *ucPtr; // Temporary name holder
ucPtr = L"quit";
m_app.m_lpDispatch->GetIDsOfNames(
IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
);
m_app.InvokeHelper(dispID, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
// Release application object.
m_app.ReleaseDispatch();
Inicie o ClassWizard MFC (CTRL+W) e adicione uma nova classe derivada da CCmdTarget e com suporte a automação (verificar "Automação" opção). Nome desta classe MyEventSink; ele será nossa implementação de eventos de aplicativo do Microsoft Word.
No ClassWizard MFC, clique na guia de automação e adicione esses três métodos na ordem:
void Startup()
void Quit()
void DocumentChange()
Em MyEventSink.cpp, implementar esses novos métodos para exibir caixas de mensagem quando eles são chamados para informá-lo quando eles são disparados:
Abra o arquivo MyEventSink.cpp e localize a declaração IID_IMyEventSink. O ClassWizard gerado um novo GUID aleatório para sua interface, mas porque você está implementando uma interface específica que já tem um GUID, você precisará alterar seu para corresponder à. Modifique a declaração para IID_IMyEventSink da seguinte maneira: estático IID_IMyEventSink GUID const = {0x000209f7 0x000, 0 x 0000, {0xc0, 0 x 00, 0 x 0, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0x46}};
Adicionar as seguintes variáveis membro públicas à sua classe WordEventsDlg em WordEventsDlg.h:
Mover a declaração acima a palavra "Protegido" para que as linhas de código aparecem da seguinte maneira:
virtual ~MyEventSink();
// Implementation
protected:
// virtual ~MyEventSink(); // Or this line may be removed.
Finalmente, verifique se que as bibliotecas OLE/COM obter a oportunidade de inicializar. Adicione o direito de código seguinte antes do manipulador do botão "Iniciar e a instalação". Isso cria uma classe global que é criada na inicialização do aplicativo e destruída ao sair. O construtor e destruidor dessa classe fornecem uma maneira útil executar limpeza e de inicialização:
// 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;
Compilar e executar.
Depois de executar o aplicativo, clique no botão " Iniciar e a instalação " para iniciar o Microsoft Word e configurar notificações de eventos. No Microsoft Word, no menu arquivo , clique em novo para criar um novo documento. Seu evento DocumentChange() deve obter acionado. Abra outro documento e observe que ele também é acionado quando alternar ativação de um documento para outro. Você pode clicar no botão " Sair e limpar backup " para parar as notificações de evento e feche o Microsoft Word, ou você pode sair do Microsoft Word (no menu arquivo , clique em Sair ) e observe a notificação de sair.
Você pode notar que o evento Startup nunca será acionado. Isso ocorre porque ele acionado antes de configurar os eventos. Observe que há realmente há motivo para tratar este evento, porque o aplicativo deve ter sido iniciado antes de chamar e definir propriedades e métodos de automação.
Microsoft Excel suporta vários eventos interessantes e úteis e você pode seguir as etapas aqui para capturá-los. No entanto, há alguns pontos a lembrar:
Use o Visualizador objeto OLE/COM que acompanha o Microsoft Visual C++ 5.0 para exibir a biblioteca de tipos do servidor que você está interessado. Para localizar os eventos, abra as declarações coclass (geralmente na parte inferior da árvore); os eventos associados para cada coclass serão listados. Quando você clica em uma interface de evento que você pode ver os eventos que estão disponíveis, os DISPIDs e como elas são declaradas no modo de exibição à direita.
Não foi necessária para modificar os DISPIDs para nossos métodos em nossa classe MyEventSink porque do Microsoft Word aplicativo eventos, Startup(), Quit() e DocumentChange() tem DISPIDs 1, 2 e 3, respectivamente. Se você criar esses métodos na ordem, você não precisa modificá-los para coincidir com a biblioteca de tipos porque ClassWizard inicia em 1 DISPID. No entanto, a maioria dos eventos, como eventos de pasta de trabalho do Microsoft Excel, não são iniciados com DISPID 1. Em tais casos, você deve modificar explicitamente o mapa de expedição MyEventSink.cpp para coincidir com os DISPIDs com os métodos corretos.
Para obter mais informações sobre como criar coletor de interfaces e simplificar o processo de conexão, clique no número abaixo para lê-lo na Base de dados de Conhecimento da Microsoft:
181845
(http://support.microsoft.com/kb/181845/
)
COMO: Criar uma interface de coletor no cliente de COM base em MFC
Para um exemplo de geral e obter mais informações sobre, pontos de conexão, consulte o exemplo Connpts.exe descrito no seguinte artigo na Base de dados de Conhecimento da Microsoft:
152087
(http://support.microsoft.com/kb/152087/
)
Pontos de conexão Implements Connpts.exe em aplicativos do MFC
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: 183599
(http://support.microsoft.com/kb/183599/en-us/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
Diga-nos o porque e o que podemos fazer para melhorar esta informação
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.