Zugreifen auf Excel-Instanz- und Hauptfensterhandles
Gilt für: Excel 2013 | Office 2013 | Visual Studio
Um in der Windows-Umgebung zu programmieren, müssen Sie manchmal das Microsoft Excel-instance-Handle oder Standard Fensterhandle kennen. Diese Handles sind beispielsweise nützlich, wenn Sie benutzerdefinierte Windows-Dialogfelder erstellen und anzeigen.
Es gibt zwei reine XLL-C-API-Funktionen, die Zugriff auf diese Handles ermöglichen: die xlGetInst-Funktion bzw. die xlGetHwnd-Funktion . In Win32 sind alle Handles ganze 32-Bit-Zahlen. Als xloper entworfen wurde, war Windows jedoch ein 16-Bit-System. Daher ist die -Struktur nur für 16-Bit-Handles zulässig. In Win32 geben die xlGetInst-Funktion und die xlGetHwnd-Funktion nur den unteren Teil des vollständigen 32-Bit-Handles zurück, wenn sie mit Excel4 oder Excel4v aufgerufen werden.
Wenn diese Funktionen in Excel 2007 und höheren Versionen mit Excel12 oder Excel12v aufgerufen werden, enthält die zurückgegebene XLOPER12 das vollständige 32-Bit-Handle.
Das Abrufen des vollständigen instance Handle ist in jeder Excel-Version einfach, da es an den Windows-Rückruf DllMain übergeben wird, der beim Laden der DLL aufgerufen wird. Wenn Sie dieses instance Handle in einer globalen Variablen aufzeichnen, müssen Sie niemals die xlGetInst-Funktion aufrufen.
Abrufen des Excel-Haupthandles in Excel 2003 und früher
Um das Standard Excel-Handle in Excel 2003 und früheren 32-Bit-Versionen zu erhalten, müssen Sie zuerst die xlGetHwnd-Funktion aufrufen, um das niedrige Wort des tatsächlichen Handles abzurufen. Anschließend müssen Sie die Liste der Fenster der obersten Ebene durchlaufen, um nach einer Übereinstimmung mit dem zurückgegebenen niedrigen Wort zu suchen. Der folgende Code veranschaulicht die Technik.
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;
}
Siehe auch
Anzeigen von Dialogfeldern aus einer DLL oder XLL
C-API-Funktionen, die nur aus einer DLL oder XLL aufgerufen werden können