Accéder à l'instance Excel et aux handles de fenêtre principauxAccess Excel Instance and Main Window Handles

S’applique à: Excel 2013 | Office 2013 | Visual StudioApplies to: Excel 2013 | Office 2013 | Visual Studio

Pour programmer dans l'environnement Windows, vous devez parfois posséder le handle de l'instance Microsoft Excel ou le handle de la fenêtre principale.To program in the Windows environment, sometimes you must know the Microsoft Excel instance handle or main window handle. Par exemple, ces handles sont utiles lorsque vous créez et affichez des boîtes de dialogue Windows personnalisées.For example, these handles are useful when you are creating and displaying custom Windows dialog boxes.

Il existe deux fonctions d'API C XLL uniquement qui fournissent l'accès à ces handles: la fonction xlGetInst et la fonction xlGetHwnd .There are two XLL-only C API functions that provide access to these handles: the xlGetInst function and the xlGetHwnd function respectively. Dans Win32, tous les handles sont des entiers 32 bits.In Win32, all handles are 32-bit integers. Toutefois, lorsque la conception XLOPER a été conçue, Windows était un système 16 bits.However, when the XLOPER was designed, Windows was a 16-bit system. Par conséquent, la structure n'est autorisée que pour les handles 16 bits.Therefore, the structure only allowed for 16-bit handles. Dans Win32, lorsqu'elle est appelée avec Excel4 ou Excel4v, la fonction xlGetInst et la fonction xlGetHwnd renvoient uniquement la partie basse de la poignée complète 32 bits.In Win32, when called with Excel4 or Excel4v, the xlGetInst function and the xlGetHwnd function return only the low part of the full 32-bit handle.

Dans Excel 2007 et versions ultérieures, lorsque ces fonctions sont appelées avec Excel12 ou Excel12v, le XLOPER12 renvoyé contient la poignée complète 32 bits.In Excel 2007 and later versions, when these functions are called with Excel12 or Excel12v, the returned XLOPER12 contains the full 32-bit handle.

L'obtention du handle d'instance complet est simple dans n'importe quelle version d'Excel, car il est transmis au service DllMainde rappel Windows, qui est appelé lors du chargement de la dll.Obtaining the full instance handle is simple in any version of Excel, as it is passed to the Windows callback DllMain, which is called when the DLL is loaded. Si vous enregistrez ce handle d'instance dans une variable globale, vous n'avez jamais besoin d'appeler la fonction xlGetInst .If you record this instance handle in a global variable, you never need to call the xlGetInst function.

Obtention du handle Excel principal dans Excel 2003 et versions antérieuresObtaining the Main Excel Handle in Excel 2003 and Earlier

Pour obtenir le descripteur Excel principal dans Excel 2003 et les versions antérieures de 32 bits, vous devez d'abord appeler la fonction xlGetHwnd afin d'obtenir le mot bas du handle réel.To obtain the main Excel handle in Excel 2003 and earlier 32-bit versions, you must first call the xlGetHwnd function to obtain the low word of the actual handle. Ensuite, vous devez parcourir la liste des fenêtres de niveau supérieur pour rechercher une correspondance avec le mot bas renvoyé.Then, you must iterate the list of top-level windows to search for a match with the returned low word. Le code suivant illustre la technique.The following code illustrates the technique.

typedef struct _EnumStruct
{
  HWND hwnd;  // Return value for Excel main hWnd.
  unsigned short wLoword; //Contains LowWord of the Excel main hWnd
} EnumStruct;
#define CLASS_NAME_BUFFER  50
BOOL CALLBACK EnumProc(HWND hwnd, EnumStruct * pEnum)
{
  // First check the class of the window. Must be "XLMAIN".
  char rgsz[CLASS_NAME_BUFFER];
  GetClassName(hwnd, rgsz, CLASS_NAME_BUFFER);
  if (!lstrcmpi(rgsz, "XLMAIN"))
  {
    // If that hits, check the loword of the window handle.
    if (LOWORD((DWORD) hwnd) == pEnum->wLoword)
    {
      // We have a match, return Excel main hWnd.
      pEnum->hwnd = hwnd;
      return FALSE;
    }
  }
  // No match - continue the enumeration.
  return TRUE;
}
BOOL GetHwnd(HWND * pHwnd)
{
  XLOPER x;
  //
  // xlGetHwnd only returns the LoWord of Excel hWnd
  // so all the windows have to be enumerated to see
  // which match the LoWord returned by xlGetHwnd.
  //
  if (Excel4(xlGetHwnd, &x, 0) == xlretSuccess)
  {
    EnumStruct enm;
    enm.hwnd = NULL;
    enm.wLoword = x.val.w;
    EnumWindows((WNDENUMPROC) EnumProc, (LPARAM) &enm);
    if (enm.hwnd != NULL)
    {
      *pHwnd = enm.hwnd;
      return TRUE;
    }
  }
  return FALSE;
}

Voir aussiSee also

Affichage des boîtes de dialogue dans un fichier DLL ou XLLDisplaying Dialog Boxes from Within a DLL or XLL

Fonctions de l’API C à appeler à partir d’un fichier DLL ou XLLC API Functions That Can Be Called Only from a DLL or XLL

D�veloppement de XLL de Excel 2013Developing Excel XLLs