The object models for most Microsoft Office applications do
not expose properties for retrieving the application window handles. To
determine the window handle of an Office application that you are automating,
you can use the
FindWindow function with the class name of the top-most window for the
application. If the application can have multiple instances running at the same
time, then you may need to account for this so that you retrieve the correct
window handle. The following sections illustrate techniques for retrieving the
window handle for both single and multiple instance applications.
Note The Microsoft Access object model exposes the
hWndAccessApp property for the
Application object for determining the window handle of the application. You
can also use the
hWnd property for forms and for reports to retrieve handles to those
specific windows. Additionally, Microsoft Excel 2002 is the first version of Excel to
introduce an
hWnd property for its
Application object. With respect to Excel versions 2002 and later and Access
versions 97 and later, because these Office applications provide a means
through their respective object models to retrieve the window handle for the
application, the
FindWindow approach that is discussed in this article is not necessary.
Find the Window Handle for an Application That Is Single Instance
The following steps illustrate how you can use the
FindWindow function with a Visual C# Automation client to determine the
window handle for an out-of-process Automation server that can have only a
single instance. This is the technique you employ when you use PowerPoint as
your Automation server.
Step-by-Step Example- Start Microsoft Visual Studio .NET.
- On the File menu, click New, and then click Project. Select Windows Application from the Visual C# Project types. Form1 is created by
default.
- Add a reference to Microsoft PowerPoint Object Library. To do this, follow these steps:
- On the Project menu, click Add Reference.
- On the COM tab, locate Microsoft PowerPoint Object Library, and then click Select.
Note Microsoft Office 2003 includes Primary Interop Assemblies (PIAs). Microsoft Office
XP does not include PIAs, but they can be downloaded.
For additional information about Office XP PIAs, click the following article number to view the article in the Microsoft Knowledge Base:
328912
INFO: Microsoft Office XP PIAs Are
Available for Download
- Click OK in the Add References dialog box to accept your selections.
- On the View menu, select Toolbox to display the toolbox, and then add a button to the form.
- Press F7 to view the code window for Form1.
- Add the following directive to the list of using directives
defined at the top of code window:
using System.Runtime.InteropServices;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
- Add the following code after the directive definitions:
public class MyApi
{
[DllImport("user32.dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
};
- Add the following code to the Click event of 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();
Note "PP10FrameClass" is the class name for the Microsoft PowerPoint 2002
application window. If you are automating Microsoft Office PowerPoint 2003, change the class
name in the code to "PP11FrameClass." - Press F5 and click Button1 to run the sample.
Find the Window Handle for an Application That Can Have Multiple Instances
Some applications, such as Microsoft Excel or Microsoft Word, can have multiple
instances running at the same time. To retrieve the handle to the application
instance that you are automating, you can first use Automation to change the
title of the application to a unique value and then use the
FindWindow API function to retrieve its window handle. The following steps
illustrate this technique by using Excel as the Automation server.
Step-by-Step Example- Start Microsoft Visual Studio .NET.
- On the File menu, click New, and then click Project. Select Windows Application from the Visual C# Project types. Form1 is created by default.
- Add a reference to Microsoft Excel Object Library. To do this, follow these steps:
- On the Project menu, click Add Reference.
- On the COM tab, locate Microsoft Excel Object Library, and then click Select.
Note Microsoft Office 2003 includes Primary Interop Assemblies (PIAs). Microsoft Office
XP does not include PIAs, but they can be downloaded.
For additional information about Office XP PIAs, click the following article number to view the article in the Microsoft Knowledge Base:
328912
INFO: Microsoft Office XP PIAs Are
Available for Download
- Click OK in the Add References dialog box to accept your selections.
- On the View menu, select Toolbox to display the toolbox, and then add a Button to the form.
- Press F7 to view the code window for Form1.
- Add the following directive to the list of using directives
defined at the top of code window:
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
- Add the following code after the directive
definitions:
public class MyApi
{
[DllImport("user32.dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
};
- Add the following code to the Click event of 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();
- Press F5 and click Button1 to run the sample.