Share via


Excel インスタンスと メイン ウィンドウ ハンドルへのアクセス

適用対象: Excel 2013 | Office 2013 | Visual Studio

Windows 環境でプログラミングをする場合、Microsoft Excel のインスタンス ハンドルまたはメイン ウィンドウのハンドルの理解が必要になることがあります。 たとえば、これらのハンドルは、カスタムの Windows ダイアログ ボックスを作成し、表示するのに役立ちます。

これらのハンドルへのアクセスを提供する XLL 専用の C API 関数は、 それぞれ xlGetInst 関数と xlGetHwnd 関数の 2 つあります。 Win32 では、すべてのハンドルは 32 ビット整数です。 ただし、 XLOPER が設計されたとき、Windows は 16 ビット システムでした。 そのため、構造体は 16 ビット ハンドルに対してのみ許可されます。 Win32 では、Excel4 または Excel4v で呼び出されると、xlGetInst 関数と xlGetHwnd 関数は、完全な 32 ビット ハンドルの下位部分のみを返します。

Excel 2007 以降のバージョンでは、Excel12 または Excel12v でこれらの関数が呼び出されると、返される XLOPER12 は完全な 32 ビット ハンドルから成っています。

完全なインスタンス ハンドルの取得は、DLL の読み込み時に呼び出される Windows コールバック DllMain に渡されるため、任意のバージョンの Excel では簡単です。 このインスタンス ハンドルをグローバル変数に記録する場合は、 xlGetInst 関数を呼び出す必要はありません。

Excel 2003 以前のバージョンでの メイン Excel ハンドルの取得

Excel 2003 以前の 32 ビット バージョンのメイン Excel ハンドルを取得するには、まず xlGetHwnd 関数を呼び出し、実際のハンドルの下位ワードを取得します。 次に、返された下位ワードと一致するものを検索するために、トップレベル ウィンドウの一覧を反復処理する必要があります。 次のコードは、その技法を示しています。

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

関連項目

DLL または XLL ファイルの中からダイアログ ボックスを表示する

DLL または XLL からのみ呼び出し可能な C API 関数

Excel XLL の開発