システムメニューの情報取得             <TOP>


システムメニュー情報を取得します。

GetSystemMenu システムメニューハンドル取得

GetSubMenu サブメニューハンドル取得

GetMenuString メニュー文字列取得
GetMenuItemID メニュー項目ID取得

GetMenuItemCount メニュー項目数取得

GetMenuItemInfo メニュー情報取得

 

フォームのアイコンをクリックすると図のようなメニュー(システムメニュー)が表示されます。

最大表示ボタンおよびアイコン化ボタンをありに設定しています。

関数実行ボタンをクリックするとそれらがリスト表示され、リスト内で選択するとその情報が表示されます。

図は、最大表示ボタンおよびアイコン化ボタンをなしに設定した状態でメニュー情報を取得しています。

最大表示ボタンおよびアイコン化ボタンをなしに設定している。

 

'================================================================
'= システムメニューの状態取得
'=    (GetSystemMenu.bas)
'================================================================
#include "Windows.bi"

Type MENUITEMINFO
    cbSize        As Long                   '構造体のバイト数
    fMask         As Long                   '取得する情報を指定する定数の組み合わせ
    fType         As Long                   'メニュー項目のタイプを指定する定数の組み合わせ
    fState        As Long                   'メニューの状態を指定する定数の組み合わせ
    wID           As Long                   'ユーザー定義のメニュー項目のID
    hSubMenu      As Long                   '指定のメニュー項目と関連するサブメニューのハンドル
    hbmpChecked   As Long                   'チェックマーク用のビットマップのハンドル
    hbmpUnChecked As Long                   '未チェック時のときのビットマップハンドル
    dwItemData    As Long                   'メニュー項目と関連するユーザー定義の値
    dwTypeData    As Long                   'メニュー項目のタイプ(fMaskにMIIM_TYPEを指定したときのみ有効)
    cch           As Long                   'メニュー項目のテキストのバイト数
End Type

' システムメニューのハンドルを取得する
Declare Function Api_GetSystemMenu& Lib "user32" Alias "GetSystemMenu" (ByVal hWnd&, ByVal bRevert&)

' サブメニューのハンドル取得
Declare Function Api_GetSubMenu& Lib "user32" Alias "GetSubMenu" (ByVal hMenu&, ByVal nPos&)

' メニューの文字列取得
Declare Function Api_GetMenuString& Lib "user32" Alias "GetMenuStringA" (ByVal hMenu&, ByVal uIDItem&, ByVal lpString$, ByVal nMaxCount&, ByVal uFlag&)

' メニュー項目のID取得
Declare Function Api_GetMenuItemID& Lib "user32" Alias "GetMenuItemID" (ByVal hMenu&, ByVal nPos&)

' メニューの項目数を取得
Declare Function Api_GetMenuItemCount& Lib "user32" Alias "GetMenuItemCount" (ByVal hMenu&)

' メニューの情報取得
Declare Function Api_GetMenuItemInfo& Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu&, ByVal uItem&, ByVal fByPosition&, lpMInfo As MENUITEMINFO)

#define MF_BYCOMMAND &H0                    'uIDItemはメニュー項目のID
#define MF_BYPOSITION &H400                 'uIDItemはメニュー項目のインデックス
#define MIIM_STATE &H1                      'fStateメンバ

Var Shared List1 As Object
Var Shared Edit(2) As Object
Var Shared Text(2) As Object
Var Shared Group1 As Object
Var Shared Button1 As Object

For i = 0 To 2
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
Next i
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Group1.Attach GetDlgItem("Group1") : Group1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hSysMenu As Long
    Var SysMenuCnt As Long
    Var Temp$ As String
    Var Ret As Long

    'リストボックスのクリア
    List1.ResetContent

    'システムメニューのハンドル取得
    hSysMenu = Api_GetSystemMenu(GetHwnd, 0)

    'システムメニューの項目数を取得
    SysMenuCnt = Api_GetMenuItemCount(hSysMenu)

    '各項目のキャプションを取得
    For i = 0 To SysMenuCnt - 1
        Temp$ = String$(256, Chr$(0))
        Ret = Api_GetMenuString(hSysMenu, i, Temp$, Len(Temp$), MF_BYPOSITION)
    
        ptr = InStr(Temp$, Chr$(0))
        If ptr - 1 > 0 Then
            List1.AddString Mid$(Temp$, 1, ptr - 1)
        Else
            List1.AddString ""
        End If
    Next i
End Sub

'================================================================
'=
'================================================================
Declare Sub List1_Click edecl ()
Sub List1_Click()
    Var ListIndex As Long
    Var hSysMenu As Long
    Var SysMenuCnt As Long
    Var Temp$ As String
    Var hSubMenu As Long
    Var IDItem As Long
    Var lpMInfo As MENUITEMINFO
    Var rc As Long
    Var Ret As Long

    'システムメニューのハンドル取得
    hSysMenu = Api_GetSystemMenu(GetHwnd, 0)

    '現在選択されている項目の番号を取得
    ListIndex = List1.GetCursel

    If ListIndex <> -1 Then
        'キャプション取得
        Temp$ = String$(256, Chr$(0))
        Ret = Api_GetMenuString(hSysMenu, ListIndex, Temp$, Len(Temp$), MF_BYPOSITION)
    
        ptr = InStr(Temp$, Chr$(0))
        If ptr - 1 > 0 Then
        Edit(0).SetWindowText Mid$(Temp$, 1, ptr - 1)
    Else
        Edit(0).SetWindowText ""
    End If
        
    'ID取得
    IDItem = Api_GetMenuItemID(hSysMenu, ListIndex)
    Edit(1).SetWindowText Trim$(Str$(IDItem))
    
    lpMInfo.cbSize = Len(lpMInfo)
    lpMInfo.fMask = MIIM_STATE
    
    Ret = Api_GetMenuItemInfo(hSysMenu, ListIndex, MF_BYPOSITION, lpMInfo)
    
    rc = lpMInfo.fState
    Select Case rc
        Case 0
            Temp$ = "選択可"
        Case 3
            Temp$ = "選択不可"
        Case 4096
            Temp$ = "選択可(強調表示)"
    End Select

    If Temp$ = "" Then Temp$ = "?????????"
        Edit(2).SetWindowText Temp$
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End