Compartir a través de


Obtener acceso a la instancia de Excel y los controladores de la ventana principal

Hace referencia a: Excel 2013 | Office 2013 | Visual Studio

Para programar en el entorno de Windows, a veces debe conocer el identificador de instancia de Microsoft Excel o el identificador de ventana principal. Por ejemplo, estos identificadores son útiles al crear y mostrar cuadros de diálogo de Windows personalizados.

Hay dos funciones de API de C solo XLL que proporcionan acceso a estos identificadores: la función xlGetInst y la función xlGetHwnd respectivamente. En Win32, todos los identificadores son enteros de 32 bits. Sin embargo, cuando se diseñó el XLOPER , Windows era un sistema de 16 bits. Por lo tanto, la estructura solo se permite para los identificadores de 16 bits. En Win32, cuando se llama a con Excel4 o Excel4v, la función xlGetInst y la función xlGetHwnd devuelven solo la parte baja del identificador completo de 32 bits.

En Excel 2007 y versiones posteriores, cuando se llama a estas funciones con Excel12 o Excel12v, el XLOPER12 devuelto contiene el identificador completo de 32 bits.

Obtener el identificador de instancia completo es sencillo en cualquier versión de Excel, ya que se pasa a la dllMain de devolución de llamada de Windows, a la que se llama cuando se carga el archivo DLL. Si registra este identificador de instancia en una variable global, nunca tendrá que llamar a la función xlGetInst .

Obtención del identificador principal de Excel en Excel 2003 y versiones anteriores

Para obtener el identificador principal de Excel en Excel 2003 y versiones anteriores de 32 bits, primero debe llamar a la función xlGetHwnd para obtener la palabra baja del identificador real. A continuación, debe recorrer en iteración la lista de ventanas de nivel superior para buscar una coincidencia con la palabra baja devuelta. En el código siguiente se muestra la técnica.

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;
}

Vea también

Mostrar cuadros de diálogo desde una DLL o XLL

Funciones de la API de C que se pueden llamar solo desde una DLL o XLL

Desarrollo de XLL de Excel de 2013