演習35 「API」 の解説 No.2


演習35 の (2)(3)(4) において、'Win32 API'関数を実際に使用する。
前ページで紹介した 《APIの参考書籍》 に、'Win32 API' の概念と
'Excel VBA' から操作する時の諸注意について、詳細な解説がされて
いるので、必読のこと。ここのコードも、書籍 の 215〜230 ページを
参考にしている。


《閉じる[x]ボタンを 無効(Gray化) にする》


'------------- [ThisWorkbook] -------------

Private Sub Workbook_Open()
  UserForm2.Show
End Sub


'--------------- [Module2] ---------------

'API関数と定数の宣言

'クラスからウィンドウハンドルを取得
Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" _
    (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
     
'ウィンドウに関する情報を取得
Declare Function GetSystemMenu Lib "user32" _
    (ByVal hwnd As Long, _
     ByVal bRevert As Long) As Long
   
'メニューから項目を削除
Declare Function DeleteMenu Lib "user32" _
    (ByVal hMenu As Long, _
     ByVal nPosition As Long, _
     ByVal wFlags As Long) As Long

'ウィンドウのメニューバー外枠を再描画
Declare Function DrawMenuBar Lib "user32" _
    (ByVal hwnd As Long) As Long

'定数の設定
Public Const SC_CLOSE = &HF060&
Public Const MF_BYCOMMAND = &H0&


'-------------- [UserForm2] --------------

Private Sub UserForm_Initialize()
  '[x]ボタン無効(Gray化)
  Dim hwnd As Long
  Dim hMenu As Long
  Dim rc As Long
  Dim strClassName As String  'クラス名
    
  'ユーザーフォームのクラス名を指定
  strClassName = "ThunderDFrame"
  
  'ウィンドウのハンドルを取得
  hwnd = FindWindow(strClassName, Me.Caption)

  'ウィンドウに関する情報を取得
  hMenu = GetSystemMenu(hwnd, 0&)

  '[x]ボタンを無効(Gray化)
    rc = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
    
    'ウィンドウのメニューバーを再描画
    rc = DrawMenuBar(hwnd)
End Sub
'-----------------------------------------

Private Sub CommandButton2_Click()
  Unload Me
End Sub
'-----------------------------------------


API No.1 へ戻る.
API No.3 へ移る.                            back top