/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ /* * Description: Put MSO in a state where it can be closed using * automation or kill it completely */ #include "stdafx.h" #include void KillOffice(); BOOL KillAppFromWindow(HWND hWnd, char *appName); BOOL CloseActiveDialogs(); void printUsage(); //Callbacks used in closing BOOL CALLBACK CloseOfficeDlgProc(HWND hwndChild, LPARAM lParam); BOOL CALLBACK CountOfficeDlgProc(HWND hwndChild, LPARAM lParam); //Global counters for number of windows found int gWDDlgCount = 0; int gXLDlgCount = 0; int gPPDlgCount = 0; //Dialog window class names for excel, powerpoint and word //These are "Best guess" dialog names const char *pWordDlg2k = "bosa_sdm_Microsoft Word 9.0"; const char *pWordDlg2k3 = "bosa_sdm_Microsoft Office Word"; const char *pXLDlg2k = "bosa_sdm_XL9"; const char *pPPDlg2k = "#32770"; const char *pXLDlg2k3 = "bosa_sdm_XL9"; const char *pPPDlg2k3 = "#32770"; const char *pGenMSODlg = "bosa_sdm_Mso96"; //consider adding - bosa_sdm_Mso96 //Command Line Argument constants const char *ARG_HELP = "--help"; const char *ARG_KILL = "--kill"; const char *ARG_CLOSE = "--close"; //Window class names for MSO apps - if we need to look at other office instances //then this list would need to be expanded #define NUM_WINDOWCLASSNAMES 4 char *wndClassName[NUM_WINDOWCLASSNAMES] = {"OpusApp", "XLMAIN", "PP9FrameClass", "PP10FrameClass"}; int main(int argc, char* argv[]) { if (argc < 2) { printUsage(); return 0; } if (strcmpi(argv[1], ARG_HELP) == 0) { printUsage(); return 0; } if (strcmpi(argv[1], ARG_KILL) == 0) { KillOffice(); return 0; } if (strcmpi(argv[1], ARG_CLOSE) == 0) { CloseActiveDialogs(); return 0; } return 0; } /*-------------------------------------------------------------- Find the MSO window if it is available and explicitly kill it MSO apps in this case are Excel, Word and PP Use FindWindow Win32 API to detect if they are available -------------------------------------------------------------*/ void KillOffice() { HWND hWnd; for (int i=0;i