Attribute VB_Name = "xShowWindow関数"
' @(h) xShowWindow関数.bas                                      ver 1.0 ( '98.10.22  )

' @(s)
'  指定されたウィンドウの表示状態を設定する関数
'  本モジュールはテスト用コードモジュールです。
'
Option Explicit
'
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Const SW_HIDE = 0                                       '' ウィンドウを非表示にし、他のウィンドウをアクティブにします。
Private Const SW_MAXIMIZE = 3                                   '' ウィンドウを最大化します。
Private Const SW_MINIMIZE = 6                                   '' ウィンドウを最小化し、Z 順位が次のトップレベルウィンドウをアクティブにします。
Private Const SW_RESTORE = 9                                    '' ウィンドウをアクティブにし、表示します。ウィンドウが最小化されていたり最大化されていたりすると、元の位置とサイズに戻ります。
Private Const SW_SHOW = 5                                       '' ウィンドウをアクティブにして、現在の位置とサイズで表示します。
Private Const SW_SHOWDEFAULT = 10                               '' アプリケーションを起動させたプログラムが CreateProcess 関数に渡すSTARTUPINFO 構造体の wShowWindow メンバで指定された SW_ フラグを基にして、表示状態を設定します。
Private Const SW_SHOWMAXIMIZED = 3                              '' ウィンドウをアクティブにして、最大化します。
Private Const SW_SHOWMINIMIZED = 2                              '' ウィンドウをアクティブにして、最小化します。
Private Const SW_SHOWMINNOACTIVE = 7                            '' ウィンドウを最小化します。アクティブなウィンドウは、アクティブな状態を維持します。非アクティブなウィンドウは、非アクティブなままです。
Private Const SW_SHOWNA = 8                                     '' ウィンドウを現在の状態で表示します。アクティブなウィンドウはアクティブな状態を維持します。
Private Const SW_SHOWNOACTIVATE = 4                             '' ウィンドウを直前の位置とサイズで表示します。アクティブなウィンドウはアクティブな状態を維持します。
Private Const SW_SHOWNORMAL = 1                                 '' ウィンドウをアクティブにして、表示します。ウィンドウが最小化または最大化されているときは、位置とサイズを元に戻します。
'
Type POINT
    x As Long
    y As Long
End Type
'
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
'
Private Const WPF_SETMINPOSITION = &H1
Private Const WPF_RESTORETOMAXIMIZED = &H2
Type WINDOWPLACEMENT
    length As Long                  '' この構造体のバイト単位のサイズを指定します。
    flags As Long                   '' アイコン化されたウィンドウの位置と、ウィンドウを元に戻す方法を制御するフラグを指定します。このメンバは、次に示すフラグのどちらかまたは両方になります。
                                    '' WPF_SETMINPOSITION   アイコン化されたウィンドウの x 位置と y 位置が指定できることを示します。座標を ptMinPosition メンバに設定するときは、このフラグを指定します。
                                    '' WPF_RESTORETOMAXIMIZED   アイコン化される前に最大表示されていたかどうかにかかわらず、元に戻されるウィンドウを最大表示することを指定します。この設定は、次にウィンドウが元に戻されるときにのみ有効です。デフォルトの復元動作は変更しません。このフラグは、showCmd メンバに SW_SHOWMINIMIZED の値が指定されたときにだけ有効です。
    showCmd As Long                 '' ウィンドウの現在の表示状態を指定します。
                                    '' SW_HIDE ウィンドウを非表示にして、他のウィンドウをアクティブにします。
                                    '' SW_MINIMIZE   指定されたウィンドウをアイコン化して、システム リストのトップレベル ウィンドウをアクティブにします。
                                    '' SW_RESTORE   ウィンドウをアクティブにし、表示します。ウィンドウがアイコン化、または最大表示されていると、ウィンドウは元の位置とサイズに復元されます (SW_SHOWNORMAL と同じです)。
                                    '' SW_SHOW ウィンドウをアクティブにし、現在の位置とサイズで表示します。
                                    '' SW_SHOWMAXIMIZED ウィンドウをアクティブにし、最大表示します。
                                    '' SW_SHOWMINIMIZED ウィンドウをアクティブにし、アイコンとして表示します。
                                    '' SW_SHOWMINNOACTIVE ウィンドウをアイコンとして表示します。現在アクティブなウィンドウはアクティブのままです。
                                    '' SW_SHOWNA ウィンドウを現在の状態で表示します。現在アクティブなウィンドウはアクティブのままです。
                                    '' SW_SHOWNOACTIVATE ウィンドウを直前のサイズと位置で表示します。現在アクティブなウィンドウはアクティブのままです。
                                    '' SW_SHOWNORMAL   ウィンドウをアクティブにし、表示します。ウィンドウがアイコン化、または最大表示されていると、ウィンドウは元の位置とサイズで復元されます (SW_RESTORE と同じです) 。
    ptMinPosition As POINT          '' ウィンドウがアイコン化されるときの、ウィンドウの左上隅の位置を指定します。
    ptMaxPosition As POINT          '' ウィンドウが最大表示されるときの、ウィンドウの左上隅の位置を指定します。
    rcNormalPosition As RECT        '' ウィンドウが通常 (元に戻された) の位置に表示されるときの、ウィンドウの座標を指定します。
End Type
'ウィンドウの表示状態を設定します。また、通常表示、最小化、最大化されたときの位置を設定します。
Private Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
'ウィンドウの表示状態を取得します。また、通常表示、最小化、最大化されたときの位置を取得します。
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
'
Sub xShowWindowのテスト()
    Dim hwnd As Long
    Dim lpwndpl As WINDOWPLACEMENT
    
    hwnd = xGetActiveWindow
    Debug.Print xShowWindow(hwnd, SW_MINIMIZE)
    MsgBox "ウィンドウを最小化しました。"
    Debug.Print xShowWindow(hwnd, SW_MAXIMIZE)
    lpwndpl.length = Len(lpwndpl)
    Debug.Print xGetWindowPlacement(hwnd, lpwndpl)            '?????????????????????????????????
    MsgBox "ウィンドウを最大化しました。"
    Debug.Print xShowWindow(hwnd, SW_RESTORE)
    MsgBox "ウィンドウを元に戻りました。"
    Debug.Print xSetWindowPlacement(hwnd, lpwndpl)            '?????????????????????????????????
    lpwndpl.showCmd = SW_SHOWMAXIMIZED
    Debug.Print xShowWindow(hwnd, SW_SHOW)
    MsgBox "ウィンドウを最大化しました。"
End Sub

' @(f)
'
' 機能      : ウィンドウの表示状態を取得します。また、通常表示、最小化、最大化されたときの位置を取得する関数
'
' 返り値    : 関数が成功すると、0 以外の値が返ります。
'             関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。
'
' 引き数    : hwnd      - ウィンドウハンドル
'             lpwndpl   - WINDOWPLACEMENT構造体
'
' 機能説明  : ウィンドウの表示状態を取得します。また、通常表示、最小化、最大化されたときの位置を取得する関数
'
' 備考      : 特になし
'
Public Function xGetWindowPlacement(ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
    xGetWindowPlacement = GetWindowPlacement(hwnd, lpwndpl)
End Function

' @(f)
'
' 機能      : ウィンドウの表示状態を設定します。また、通常表示、最小化、最大化されたときの位置を設定する関数
'
' 返り値    : 関数が成功すると、0 以外の値が返ります。
'             関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。
'
' 引き数    : hwnd      - ウィンドウハンドル
'             lpwndpl   - WINDOWPLACEMENT構造体
'
' 機能説明  : ウィンドウの表示状態を設定します。また、通常表示、最小化、最大化されたときの位置を設定する関数
'
' 備考      : 特になし
'
Public Function xSetWindowPlacement(ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
    xSetWindowPlacement = SetWindowPlacement(hwnd, lpwndpl)
End Function

' @(f)
'
' 機能      : 指定されたウィンドウの表示状態を設定する関数
'
' 返り値    : ウィンドウが以前に表示されていたときは、0 以外の値が返ります。
'             ウィンドウが以前に非表示にされていたときは、0 が返ります。
'
' 引き数    :
'
' 機能説明  : 指定されたウィンドウの表示状態を設定する関数
'
' 備考      : 特になし
'
Public Function xShowWindow(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    xShowWindow = ShowWindow(hwnd, nCmdShow)
End Function