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