システムメニューの情報取得 <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