Gewusst wie: Zugreifen auf Instanz- und Hauptfensterhandles in Excel (maschinell übersetzt)

Letzte Änderung: Sonntag, 15. März 2009

Gilt für: Excel 2010 | Office 2010 | VBA | Visual Studio

Wichtig

Dieser Artikel wurde maschinell übersetzt. Bitte beachten Sie den Haftungsausschluss. Die englische Version des Artikels ist als Referenz hier verfügbar: here.

Für die Programmierung in der Windows-Umgebung müssen Sie manchmal den Instanzhandle oder den Hauptfensterhandle in Excel kennen. Diese Handles sind dann beispielsweise nützlich, wenn Sie benutzerdefinierte Windows-Dialogfelder erstellen und anzeigen.

Es gibt zwei nur XLL-C-API-Funktionen, die Zugriff auf diese Handles: die xlGetInst Funktion (maschinell übersetzt) und die xlGetHwnd Funktion (maschinell übersetzt) bzw.. In Win32 werden alle Handles 32-Bit-Ganzzahlen. Wenn der XLOPER entwickelt wurde, wurde Windows 16-Bit-System. Daher die Struktur nur zulässig für 16-Bit-Handles. In Win32 zurück beim Aufruf mit Excel4 oder Excel4v, der xlGetInst und xlGetHwnd-Funktion nur den unteren Teil des vollständigen 32-Bit-Handle.

Wenn diese Funktionen, mit Excel12 oder Excel12v aufgerufen werden, enthält zurückgegebenen XLOPER12 in Excel 2007 das 32-Bit-Handle.

Abrufen das vollständigen Instanzhandle ist einfach in jeder Version von Excel, wie es auf der Windows-Callback-DllMain übergeben wird, die beim Laden der DLL aufgerufen wird. Wenn Sie diese Instanzenhandle in einer globalen Variablen aufzeichnen, müssen Sie nie die Funktion xlGetInst aufrufen.

Das Main-Excel-Handle in Excel 2003 und früheren Versionen abrufen

Um das wichtigste Excel-Handle in Excel 2003 und früheren 32-Bit-Versionen zu erhalten, müssen Sie zunächst die xlGetHwnd-Funktion, um das niedrige Word der tatsächlichen Handle erhalten aufrufen. Dann müssen Sie die Liste der Fenster der obersten Ebene für die Suche nach einer Übereinstimmung mit den zurückgegebenen low Word durchlaufen. 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 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;
}

Hinweis

Haftungsausschluss für maschinelle Übersetzungen: Dieser Artikel wurde mithilfe eines Computersystems und ohne jegliche Bearbeitung durch Personen übersetzt. Microsoft bietet solche maschinellen Übersetzungen als Hilfestellung für Benutzer ohne Englischkenntnisse an, damit Sie von den Informationen zu Produkten, Diensten und Technologien von Microsoft profitieren können. Da es sich bei diesem Artikel um eine maschinelle Übersetzung handelt, enthält er möglicherweise Fehler in Bezug auf (Fach-)Terminologie, Syntax und/oder Grammatik.

Siehe auch

Konzepte

Anzeigen von Dialogfeldern aus einer DLL oder XLL heraus (maschinell übersetzt)

C-API-Funktionen, die nur aus einer DLL oder XLL aufgerufen werden können (maschinell übersetzt)

Entwickeln von Excel 2010-XLLs (maschinell übersetzt)