Win32API ウィンドウの情報を取得する GetWindowInfo

ウィンドウの情報を得るには、GetWindowInfo関数を用いる。


GetWindowInfo関数のプロトタイプは、以下の通り。

BOOL GetWindowInfo(
  HWND hwnd,
  PWINDOWINFO pwi
);


第二引数のWINDOWINFO構造体は、WinUser.h にて、以下のように定義されている。

typedef struct tagWINDOWINFO {
  DWORD cbSize;
  RECT  rcWindow;
  RECT  rcClient;
  DWORD dwStyle;
  DWORD dwExStyle;
  DWORD dwWindowStatus;
  UINT  cxWindowBorders;
  UINT  cyWindowBorders;
  ATOM  atomWindowType;
  WORD  wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;




GetWindowInfo関数を用いた簡単なサンプル

デスクトップの情報を取得し、デスクトップ領域の座標を表示する。

#include <Windows.h>
#include <stdio.h>

int main()
{
    HWND hDesktop = GetDesktopWindow();
        
    WINDOWINFO windowInfo;
    windowInfo.cbSize = sizeof(WINDOWINFO);
    
    GetWindowInfo(hDesktop, &windowInfo);

    printf("bottom=%d, left=%d, right=%d, top=%d\n", 
        windowInfo.rcWindow.bottom, 
        windowInfo.rcWindow.left,
        windowInfo.rcWindow.right,
        windowInfo.rcWindow.top);
    
    return 0;
}


実行結果

bottom=1050, left=0, right=1680, top=0



ウィンドウの情報を取得する他の関数として、GetWindowRect関数では、指定されたウィンドウのスクリーン座標を取得する。

#include <windows.h>
#include <stdio.h>

int main()
{
    HWND hWnd;
    RECT rect;

    hWnd = GetDesktopWindow();

    GetWindowRect(hWnd, &rect);

    printf("bottom=%d, left=%d, right=%d, top=%d\n", 
        rect.bottom, rect.left, rect.right, rect.top);

    return 0;
}



さらに、もうひとつのウィンドウの情報を取得する関数として、GetWindowPlacement関数では、指定されたウィンドウの表示状態、および通常表示のとき、最小化されたとき、最大化されたときの位置を返す。

#include <windows.h>
#include <stdio.h>

int main()
{
    //タスクバーのウィンドウハンドルを取得する
    HWND hWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL);
    WINDOWPLACEMENT placement;
    GetWindowPlacement(hWnd, &placement);

    printf("ptMaxPosition.x=%d, ptMaxPosition.y=%d\n",
        placement.ptMaxPosition.x, placement.ptMaxPosition.y);
    
    printf("ptMinPosition.x=%d, ptMinPosition.y=%d\n",
        placement.ptMinPosition.x, placement.ptMinPosition.y);

    printf("rcNormalPosition.bottom=%d, rcNormalPosition.left=%d, rcNormalPosition.right=%d, rcNormalPosition.top=%d\n",
        placement.rcNormalPosition.bottom, 
        placement.rcNormalPosition.left,
        placement.rcNormalPosition.right,
        placement.rcNormalPosition.top);

    switch (placement.showCmd) {
    case SW_HIDE: 
        puts("SW_HIDE");
        break;

    case SW_MINIMIZE:
        puts("SW_MINIMIZE");
        break;

    case SW_RESTORE:
        puts("SW_RESTORE");
        break;

    case SW_SHOW:
        puts("SW_SHOW");
        break;

    case SW_SHOWMAXIMIZED:
        puts("SW_SHOWMAXIMIZED");
        break;

    case SW_SHOWMINIMIZED:
        puts("SW_SHOWMINIMIZED");
        break;

    case SW_SHOWMINNOACTIVE:
        puts("SW_SHOWMINNOACTIVE");
        break;

    case SW_SHOWNA:
        puts("SW_SHOWNA");
        break;

    case SW_SHOWNOACTIVATE:
        puts("SW_SHOWNOACTIVATE");
        break;

    case SW_SHOWNORMAL:
        puts("SW_SHOWNORMAL");
        break;

    default:
        puts("Unknown");
        break;
    }

    return 0;
}




参考
http://msdn.microsoft.com/ja-jp/library/cc364758.aspx (GetWindowInfo)
http://msdn.microsoft.com/ja-jp/library/windows/desktop/ms632610(v=vs.85).aspx (WINDOWPLACEMENT構造体)
http://msdn.microsoft.com/ja-jp/library/cc364769.aspx (GetWindowRect)
http://msdn.microsoft.com/ja-jp/library/cc364767.aspx (GetWindowPlacement)