Partager via


Procédure : accéder aux handles de l’instance et de la fenêtre principale Excel (traduction automatique)

Dernière modification : dimanche 15 mars 2009

S’applique à : Excel 2010 | Office 2010 | VBA | Visual Studio

Important

Cet article a été traduit automatiquement, voir l’avertissement. Vous pouvez consulter la version en anglais de cet article ici.

Pour programmer dans l’environnement Windows, il vous faut parfois connaître le handle de l’instance Microsoft Excel ou celui de la fenêtre principale. Par exemple, ces handles sont utiles pour créer et afficher des boîtes de dialogue Windows personnalisées.

Il existe deux fonctions XLL seule API C permettant d'accéder à ces handles : le fonction xlGetInst (traduction automatique) et le fonction xlGetHwnd (traduction automatique) respectivement. Dans Win32, tous les handles sont des entiers 32 bits. Toutefois, lorsque la XLOPER a été conçu, Windows a été un système 16 bits. Par conséquent, la structure permise uniquement pour les poignées de 16 bits. 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 32 bits complet.

Dans Excel 2007, lorsque ces fonctions sont appelées avec Excel12 ou Excel12v, le XLOPER12 retourné contient un handle 32 bits.

Obtenir le handle d'instance complète est simple dans n'importe quelle version d'Excel, tel qu'il est passé à la DllMain de rappel de Windows, qui est appelée lorsque la DLL est chargée. Si vous enregistrez ce handle d'instance dans une variable globale, vous devez jamais appeler la fonction xlGetInst.

Obtention de la poignée de Excel principal dans Excel 2003 et versions antérieures

Pour obtenir le handle Excel principal dans Excel 2003 et versions antérieures de 32 bits, vous devez d'abord appeler la fonction xlGetHwnd pour obtenir le mot de poids faible du handle réel. Puis, vous devez effectuer l'itération la liste des fenêtres de niveau supérieur pour rechercher une correspondance avec le mot de poids faible retourné. Le code suivant illustre la 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 retuned 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;
}

Notes

Avertissement traduction automatique : cet article a été traduit par un ordinateur, sans intervention humaine. Microsoft propose cette traduction automatique pour offrir aux personnes ne maîtrisant pas l’anglais l’accès au contenu relatif aux produits, services et technologies Microsoft. Comme cet article a été traduit automatiquement, il risque de contenir des erreurs de grammaire, de syntaxe ou de terminologie.

Voir aussi

Concepts

Affichage de boîtes de dialogue depuis une DLL ou XLL (traduction automatique)

Fonctions de l’API C appelables uniquement depuis une DLL ou XLL (traduction automatique)

Développement de XLL Excel 2010 (traduction automatique)