ホーム > カテゴリ > Visual Basic >

システムメニューの項目を無効化、有効化、削除する

システムメニューの項目を無効化、有効化、削除するサンプルです。

サンプルの実行画面

APIの宣言

[SystemMenu.bas]

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
'システムメニューとはウインドウの左上のアイコンをクリックして
'  表示されるメニューのことです。
'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


'-----------------------------------------
'システムメニューのハンドルを取得するAPI関数
'-----------------------------------------

 'hWnd:ウインドウのハンドル
 'bRevert:現在の時0、オリジナルの時1
 
 '戻り値:システムメニューのハンドル
 
Public Declare Function GetSystemMenu Lib "USER32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

'-----------------------------------
'メニュー項目の文字列を取得するAPI関数
'-----------------------------------

 'hMen:メニューのハンドル
 'wIDItem:定数(SC_××参照)
 'lpString:文字列を格納する変数
 'nMaxCount:取得する最大値
 'wFlag:定数(MF_××参照)
 
 '戻り値:取得した文字数
 
Public Declare Function GetMenuString Lib "USER32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
  
'------------------------------
'既存のメニューを操作するAPI関数
'------------------------------
  
  'hMenu:メニューのハンドル
  'nPosition:定数(SC_××参照)
  'wFlags:定数(MF_××参照)
  'wIDNewItem:コマンドID
  'lpString:システムメニューのラベル
  
  '戻り値:正常終了0以外
  
Public Declare Function ModifyMenu Lib "USER32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As String) As Long

'------------------------------
'メニューバーを再描画するAPI関数
'------------------------------

  'hwnd:ウインドウのハンドル
 
  '戻り値:正常終了0以外
  
Public Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long


'---------------------------------------
'メニューから項目を削除するAPI関数
'---------------------------------------
 
 'hMenu:メニューのハンドル
 'nPosition:定数(SC_××参照)>>既存のメニューを削除する場合
 'wFlag: MF_BYCOMMAND
 
 '戻り値:正常終了0以外
 
Public Declare Function DeleteMenu Lib "USER32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long


Public Const SC_CLOSE = &HF060         '「閉じる」
Public Const SC_SIZE = &HF000          '「サイズ変更」
Public Const SC_MAXIMIZE = &HF030      '「最大化」
Public Const SC_RESTORE = &HF120       '「元のサイズに戻す」
Public Const SC_MINIMIZE = &HF020      '「最小化」
Public Const SC_MOVE = &HF010          '「移動」


Public Const MF_ENABLED = &H0&      'メニューを有効にする
Public Const MF_GRAYED = &H1&       'メニューを無効にする(グレー表示)
Public Const MF_DISABLED = &H2&     'メニューを無効にする(グレー表示しない)

Public Const MF_BYCOMMAND = &H0&

'------------------------------------------
'■関数名 Menu
'■用途  システムメニューを無効にする
'■引数  nHandle:ウインドウのハンドル
'     Flag:無効にする項目(SC_××参照)
'------------------------------------------

Public Sub Menu(nHandle As Long, Flag As String)

    Dim lpString As String  'システムメニューのラベル
    Dim Ret As Long         '戻り値
    Dim nLeng As Long       '文字列の長さ
    Dim hMen As Long        'システムメニューのハンドル
   
   'バッファを確保する
   lpString = String(250, Chr(0))
   nLeng = Len(lpString)
       
   'システムメニューのハンドルを確保
   hMen = GetSystemMenu(nHandle, 0)
   'システムメニューのラベルを取得
   Ret = GetMenuString(hMen, Flag, lpString, nLeng, MF_GRAYED)
   'メニューの属性を変更する
   Ret = ModifyMenu(hMen, Flag, MF_GRAYED, 0, lpString)
   '描画(変更を反映)
   Ret = DrawMenuBar(nHandle)


End Sub

'------------------------------------------
'■関数名 EnabledMenu
'■用途  システムメニューを有効にする
'■引数  nHandle:ウインドウのハンドル
'     Flag:有効にする項目(SC_××参照)
'------------------------------------------

Public Sub EnabledMenu(nHandle As Long, Flag As String)

    Dim lpString As String  'システムメニューのラベル
    Dim Ret As Long         '戻り値
    Dim nLeng As Long       '文字列の長さ
    Dim hMen As Long        'システムメニューのハンドル
   
   'バッファを確保する
   lpString = String(250, Chr(0))
   nLeng = Len(lpString)
       
   'システムメニューのハンドルを確保
   hMen = GetSystemMenu(nHandle, 1)
   'システムメニューのラベルを取得
   Ret = GetMenuString(hMen, Flag, lpString, nLeng, MF_ENABLED)
   'メニューの属性を変更する
   Ret = ModifyMenu(hMen, Flag, MF_ENABLED, 0, lpString)
   '描画(変更を反映)
   Ret = DrawMenuBar(nHandle)

End Sub

'------------------------------------------
'■関数名 Delete
'■用途  システムメニューの項目を削除する
'■引数  nHandle:ウインドウのハンドル
'     Flag:削除する項目(SC_××参照)
'------------------------------------------

Public Sub Delete(nHandle As Long, Flag As String)
  
  Dim hMen As Long       'システムメニューのハンドル
  Dim Ret As Long        '戻り値

  'システムメニューのハンドルを確保
  hMen = GetSystemMenu(nHandle, 0)
  'システムメニューの項目を削除する
  Ret = DeleteMenu(hMen, Flag, MF_BYCOMMAND)
  '描画(変更を反映)
  Ret = DrawMenuBar(nHandle)

End Sub


APIの呼び出し

[SystemMenu.frm]

Private Sub Command1_Click(Index As Integer)

    Select Case Index

        Case 0
            Call Menu(hwnd, SC_RESTORE)
            Call Menu(hwnd, SC_MOVE)
            Call Menu(hwnd, SC_SIZE)
            Call Menu(hwnd, SC_MINIMIZE)
            Call Menu(hwnd, SC_MAXIMIZE)
            Call Menu(hwnd, SC_CLOSE)
        Case 1
            Call EnabledMenu(hwnd, SC_RESTORE)
            Call EnabledMenu(hwnd, SC_MOVE)
            Call EnabledMenu(hwnd, SC_SIZE)
            Call EnabledMenu(hwnd, SC_MINIMIZE)
            Call EnabledMenu(hwnd, SC_MAXIMIZE)
            Call EnabledMenu(hwnd, SC_CLOSE)
            Call EnabledMenu(hwnd, 0)            '区切り線
        Case 2
            Call Delete(hwnd, SC_RESTORE)
            Call Delete(hwnd, SC_MOVE)
            Call Delete(hwnd, SC_SIZE)
            Call Delete(hwnd, SC_MINIMIZE)
            Call Delete(hwnd, SC_MAXIMIZE)
            Call Delete(hwnd, SC_CLOSE)
            Call Delete(hwnd, 0)                 '区切り線
            Case 3
             End
              
    End Select

End Sub

ソースコード一式のダウンロード

vbapi_systemmenu.zip 2.73 KB (2,803 バイト)

このサンプルの動作環境について

このサンプルは 「Windows98」及び「Microsoft Visual Basic 5.0 Professional Edition」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。





関連記事



公開日:2015年03月04日
記事NO:00364