(祝)東京オリンピック!

(祝)北京オリンピック!

EXCEL VBAでよく使うAPI関数

SetCurrentDirectory関数

VBScriptでオープンダイヤログを開く場合デフォルトで開くフォルダーを指定したい時、指定がネットワークフォルダーだとカレントが対応しないため、これを使って指定します。

構文C++
BOOL SetCurrentDirectory( LPCTSTR lpPathName );
パラメーター
lpPathName

新しい現在のディレクトリへのパス。 このパラメーターは、相対パスまたは完全パスを指定できます

戻り値

関数が失敗した場合、戻り値はゼロです

COPY

#If VBA7 And Win64 Then
    '64ビット版
    Public Declare PtrSafe Function SetCurrentDirectory Lib "Kernel32" Alias _
                  "SetCurrentDirectoryA" (ByVal CurrentDir As String) As LongPtr
#Else
    '32ビット版
    Public Declare Function SetCurrentDirectory Lib "Kernel32" Alias _
                  "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long
#End If

SendMessage関数

指定されたメッセージを1つまたは複数のウィンドウ(フォーム等)に送信します。

構文C++
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
パラメーター
hWnd    ウィンドウプロシージャがメッセージを受信するウィンドウのハンドル
Msg     送信するメッセージ
WM_DESTROY        &h2    ウィンドウが破棄された後、破棄されるウィンドウのウィンドウプロシージャに送信されます 次に子ウィンドウ(存在する場合)が破棄されるときに送信されます。
    wParam        使わないので 0
    lParam        使わないので 0
WM_MOVE           &h3    ウィンドウが移動された後に送信されます
    wParam        使わないので 0
    lParam        クライアント領域の左上隅のxおよびy座標 下位ワードにはx座標が含まれ、上位ワードにはy座標が含まれます
WM_SIZE	          &h5    ウィンドウのサイズが変更された直後に送信されます
    wParam        要求されたサイズ変更のタイプ
    lParam        下位ワードは、クライアント領域の新しい幅、上位ワードは、クライアント領域の新しい高さを指定します。
WM_SETTEXT        &hc    ウィンドウのテキストを設定します
    wParam        使わないので 0
    lParam        ウィンドウテキストである文字列
WM_GETTEXT        &hd    ウィンドウに対応するテキストを、呼び出し元が提供するバッファーにコピーします
    wParam        終端のヌル文字を含む、コピーされる最大文字数
    lParam        テキストを受け取るバッファー
WM_CLOSE          &h10    ウィンドウまたはアプリケーションの終了信号として送信
    wParam        使わないので 0
    lParam        使わないので 0
WM_SHOWWINDOW     &h18
WM_SIZING         &h532    ユーザーがサイズ変更しているウィンドウに送信されます このメッセージを処理することにより、アプリケーションはドラッグ長方形のサイズと位置を監視し、必要に応じてサイズまたは位置を変更できます 
    wParam        要求されたサイズ変更のタイプ
    lParam        ドラッグ矩形の画面座標を持つRECT構造体
WM_MOVING         &h534    ユーザーが移動しているウィンドウに送信されます  このメッセージを処理することにより、アプリケーションはドラッグ長方形の位置を監視し、必要に応じてその位置を変更できます
    wParam        使わないので 0
    lParam        画面座標でのウィンドウの現在の位置を持つRECT構造体
wParam            追加のメッセージ固有の情報
lParamn           追加のメッセージ固有の情報
戻り値

送信されるメッセージに依存します

COPY

'VBAで使うことを目的としているのでlPlamはMsgに応じてAny型、String型とします
#If VBA7 And Win64 Then
    Public Declare Function SendMessageA Lib "user32" _
                                        (ByVal hWnd As Long, _
                                        ByVal wMsg As Long, _
                                        ByVal wParam As Long, _
                                        lParam As Any) As Long
#Else
    Public Declare PtrSafe Function SendMessageA Lib "user32" _
                                        (ByVal hWnd As LongPtr, _
                                        ByVal wMsg As Long, _
                                        ByVal wParam As LongPtr, _
                                        lParam As Any) As LongPtr
#End If
          
'MsgがWM_SETTEXT、WM_GETTEXTの場合
#If VBA7 And Win64 Then
    Public Declare Function SendMessageA Lib "user32" _
                                        (ByVal hWnd As Long, _
                                        ByVal wMsg As Long, _
                                        ByVal wParam As Long, _
                                        lParam As String) As Long
#Else
    Public Declare PtrSafe Function SendMessageA Lib "user32" _
                                        (ByVal hWnd As LongPtr, _
                                        ByVal wMsg As Long, _
                                        ByVal wParam As LongPtr, _
                                        lParam As String) As LongPtr
#End If

GetWindowLongA関数・GetWindowLongPtreA関数

指定されたウィンドウに関する情報を取得します。
Windowsの32ビットと64ビットの両バージョンと互換性のあるコードを作成するには、GetWindowLongPtrを使用します

構文C++
LONG GetWindowLongA( HWND hWnd, int nIndex );
LONG_PTR GetWindowLongPtrA( HWND hWnd, int nIndex );
パラメータ
hWnd           ウィンドウのハンドル
nIndex         取得する値へのゼロベースのオフセット
GWL_EXSTYLE     -20& 拡張ウィンドウスタイルを取得します 
GWLP_HINSTANCE   -6& アプリケーションインスタンスへのハンドルを取得します
GWLP_HWNDPARENT  -8& 親ウィンドウへのハンドルがあれば、それを取得します
GWLP_ID         -12& ウィンドウの識別子を取得します
GWL_STYLE       -16& ウィンドウスタイルを取得します 
GWLP_USERDATA   -21& ウィンドウに関連付けられたユーザーデータを取得します
GWLP_WNDPROC     -4& ウィンドウプロシージャへのポインタ、またはハンドルを取得します
  注)&はVBで用意される型文字で、Longデータ型を表します
      型文字は、要素の名前の一部ではありません
      型文字で定義された要素は、型文字を使用せずに参照できます
戻り値

成功した場合、戻り値は要求された値です。
関数が失敗した場合、戻り値はゼロです

COPY

#If VBA7 Then
    #If Win64 Then
        Private Declare PtrSafe Function GetWindowLongPtr _
                      Lib "USER32" Alias "GetWindowLongPtrA" _
                      (ByVal hWnd As LongPtr, _
                      ByVal nIndex As Long) As LongPtr
    #Else
        Private Declare PtrSafe Function GetWindowLongPtr _
                      Lib "USER32" Alias "GetWindowLongA" _
                      (ByVal hWnd As LongPtr, _
                      ByVal nIndex As Long) As LongPtr
    #End If
#Else
    Private Declare Function GetWindowLongPtr _
                      Lib "USER32" Alias "GetWindowLongA" _
                      (ByVal hWnd As Long, _
                      ByVal nIndex As Long) As Long
#End If

SetWindowLongA関数・SetWindowLongPtreA関数

指定されたウィンドウの属性を変更します また、指定されたオフセットにある32ビット(長い)値を追加のウィンドウメモリに設定します。 Windowsの32ビットと64ビットの両バージョンと互換性のあるコードを作成するには、SetWindowLongPtrを使用します

構文C++
LONG SetWindowLongA( HWND hWnd, int nIndex, LONG dwNewLong );
LONG_PTR SetWindowLongPtrA( HWND hWnd, int nIndex, LONG_PTR dwNewLong );
パラメータ
hWnd           ウィンドウのハンドル
nIndex         取得する値へのゼロベースのオフセット
GWL_EXSTYLE     -20&    新しい拡張ウィンドウスタイルを設定します 。
GWL_HINSTANCE    -6&    新しいアプリケーションインスタンスハンドルを設定します。
GWL_ID          -12&    子ウィンドウの新しい識別子を設定します。 ウィンドウをトップレベルのウィンドウにすることはできません。
GWL_STYLE       -16&    新しいウィンドウスタイルを設定します 。
GWL_USERDATA    -21&    ウィンドウに関連付けられたユーザーデータを設定します。 このデータは、ウィンドウを作成したアプリケーションが使用するためのものです。 その値は最初はゼロです。
GWL_WNDPROC      -4&    ウィンドウプロシージャの新しいアドレスを設定します
      
  (注)&はVBで用意される型文字で、Longデータ型を表します
         型文字は、要素の名前の一部ではありません
         型文字で定義された要素は、型文字を使用せずに参照できます
    dwNewLong       以下の値を組み合わせた置換値
    WS_BORDER         &h800000      細い線の境界線を表示します
    WS_CAPTION        &hC00000      タイトルバーを表示します(WS_BORDERスタイルを含む)
    WS_CHILD        &h40000000      子ウィンドウにします メニューバーは使用不可で、WS_POPUPスタイルと併用できません
    WS_CHILDWINDOW  &h40000000      WS_CHILDスタイルと同じです
    WS_CLIPCHILDREN  &h2000000      親ウィンドウ内で描画が行われるときに、子ウィンドウが占める領域を除外します
    WS_CLIPSIBLINGS  &h4000000      子ウィンドウを相互にクリップします
    WS_DISABLED      &h8000000      無効なウィンドウにします
    WS_DLGFRAME       &h400000      ダイアログボックスで通常使用されるスタイルの境界線を表示し、タイトルバーを設定できません
    WS_GROUP           &h20000      コントロールのグループの最初のコントロールです
    WS_HSCROLL        &h100000      水平スクロールバーを表示します
    WS_ICONIC       &h20000000      最小化します
    WS_MAXIMIZE      &h1000000      最大化します
    WS_MAXIMIZEBOX     &h10000      最大化ボタンを表示します WS_SYSMENUも指定する必要があります
    WS_MINIMIZE     &h20000000      最小化します
    WS_MINIMIZEBOX     &h20000      最小化ボタンを表示します WS_SYSMENUも指定する必要があります
    WS_OVERLAPPED          &h0      オーバーラップウィンドウは、タイトルバーと境界線を表示します
    WS_OVERLAPPEDWINDOW             WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
                                              オーバーラップウィンドウです
    WS_POPUP        &h80000000      ポップアップウィンドウです WS_CHILDスタイルと併用できません
    WS_POPUPWINDOW                  WS_POPUP | WS_BORDER | WS_SYSMENU
                                              ポップアップウィンドウです ウィンドウメニューを表示するには、 WS_CAPTIONとWS_POPUPWINDOWを組み合わせる必要があります
    WS_SIZEBOX         &h40000      サイズ変更境界線があります
    WS_SYSMENU         &h80000      タイトルバーにはウィンドウメニューを表示します WS_CAPTIONも指定する必要があります
    WS_TABSTOP         &h10000      Tabキーを押したときにキーボードフォーカスを受け取ることができるコントロールです
    WS_THICKFRAME      &h40000      サイズ変更境界線があります
    WS_TILED               &h0      タイトルバーと境界線を表示します
    WS_TILEDWINDOW                  WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
                                              オーバーラップウィンドウです
    WS_VISIBLE      &h10000000      ウィンドウを表示します
    WS_VSCROLL        &h200000      垂直スクロールバーを表示します
戻り値

成功した場合、戻り値は指定された32ビット整数の以前の値です
関数が失敗した場合、戻り値はゼロです

COPY

#If VBA7 Then
    #If Win64 Then
        Private Declare PtrSafe Function GetWindowLongPtr _
                            Lib "USER32" Alias "GetWindowLongPtrA" _
                            (ByVal hWnd As LongPtr, _              
                            ByVal nIndex As Long) As LongPtr
    #Else
        Private Declare PtrSafe Function GetWindowLongPtr _
                            Lib "USER32" Alias "GetWindowLongA" _
                            (ByVal hWnd As LongPtr, _
                            ByVal nIndex As Long) As LongPtr
    #End If
#Else
    Private Declare Function GetWindowLongPtr _
                        Lib "USER32" Alias "GetWindowLongA" _
                        (ByVal hWnd As Long, _
                        ByVal nIndex As Long) As Long
#End If

MessageBox関数

MessageBox 関数は VBA の MsgBox 関数に相当するものです。

'hWnd               :ウィンドウのハンドルを指定します。
            'lpText             :メッセージボックス内のテキストを指定します。
            'lpCaption          :メッセージボックスのタイトルを指定します。
            'uType              :メッセージボックスのスタイル
            '戻り値          :選択したボタンを数値でかえす。

COPY

Public Declare PtrSafe Function MessageBox Lib "user32.dll" Alias "MessageBoxA" _
            (ByVal hWnd As Long, _
             ByVal lpText As String, _
             ByVal lpCaption As String, _
             ByVal uType As Integer) As Integer
FindWindow関数

'lpClassName        :NULL で終わる文字列へのポインタか、クラスアトムを指定します。
        'lpWindowName       :ウィンドウ名( ウィンドウのタイトル)が入ったNULLで終わる文字列へのポインタを指定します。
        '戻り値          :成功すると指定したクラス名とウィンドウ名を持つウィンドウのハンドル、失敗すれば0がかえる。
        

COPY

#If VBA7 And Win64 Then
        Private Declare PtrSafe Function FindWindow _
                            Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, _
                                                              ByVal lpWindowName As String) As LongPtr
    #Else
        Private Declare Function FindWindow
                            Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, _
                                                              ByVal lpWindowName As String) As Long
    #End If

FindWindowEx関数

'hwndParent         :親ウィンドウのハンドル
            'hwndChildAfter     :子ウィンドウのハンドル
            'lpszClass          :クラス名
            'lpszWindow         :ウィンドウ名

COPY

#If VBA7 And Win64 Then
            Private Declare PtrSafe Function FindWindowEx _
                                Lib "USER32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, _
                                                                    ByVal hWnd2 As LongPtr, _
                                                                    ByVal lpsz1 As String, _
                                                                    ByVal lpsz2 As String) As LongPtr
        #Else
            Private Declare Function FindWindowEx _
                                Lib "USER32" Alias "FindWindowExA" _
                                (ByVal hWnd1 As Long, _
                                ByVal hWnd2 As Long, _
                                ByVal lpsz1 As String, _
                                ByVal lpsz2 As String) As Long
        #End If

SetTimer関数

'HWND hWnd          : ウィンドウのハンドル
            'nIDEvent           :タイマの識別子
            'uElapse            :タイムアウト値
            'lpTimerFunc        :タイマのプロシージャ

COPY

Public Declare PtrSafe Function SetTimer Lib "user32" _
            (ByVal hWnd As Long, _
             ByVal nIDEvent As Long, _
             ByVal uElapse As Long, _
             ByVal lpTimerFunc As LongPtr) As Long

'-----------------------------------------------
'hWnd               :ウィンドウのハンドル
'uIDEvent           :タイマの識別子
Public Declare PtrSafe Sub KillTimer Lib "user32" _
            (ByVal hWnd As Long, _
             ByVal nIDEvent As Long)

メニューの表示関係


 
    

COPY

'---------------------------------------ウィンドウスタイルを決定するフラッグ
            Public Const WS_SYSMENU = &H80000                       'タイトルバーにコントロールメニューボックスを持つウィンドウ
            
            '---------------------------------------システムメニューのハイライト表示のフラッグ
            Public Const MF_BYCOMMAND = &H0&
            
            '---------------------------------------システムメニューのWM_SYSCOMMANDメッセージに設定されるフラッグ
            Public Const SC_MINIMIZE = &HF020&
            Public Const SC_MAXIMIZE = &HF030&
            Public Const SC_CLOSE = &HF060&
            Public Const SC_RESTORE = &HF120&
            
            '--------------------------------------------------------------------------
            'ウィンドウメニュー(システムメニューまたはコントロールメニューとも呼ばれる)のハンドルを取得する関数
            'hWnd               :ウィンドウメニューを保持しているウィンドウのハンドルを指定します。
            'bRevert            :関数の動作を指定します。
            '戻り値          :bRevert パラメータがFALSEの場合、ウィンドウメニューが内部でコピーされ、
            '                    コピー先のメニューハンドルが返ります。bRevertパラメータが TRUE の場合、NULLが返ります。
            Public Declare PtrSafe Function GetSystemMenu Lib "user32" _
                                  (ByVal hWnd As Long, _
                                   ByVal bRevert As Long) As Long
                
            '--------------------------------------------------------------------------
            'メニューからメニュー項目を削除する関数
            'hMenu              :削除対象のメニューのハンドルを指定します。
            'nPosit             :削除対象のメニュー項目を指定します。
            'wFlags             :uPosition パラメータの意味を指定します。
            '戻り値          :成功すれば 1、失敗すれば 0 がかえる。
            Public Declare PtrSafe Function DeleteMenu Lib "user32" _
                                  (ByVal hMenu As Long, _
                                   ByVal nPosition As Long, _
                                   ByVal wFlags As Long) As Long
                                   
            '--------------------------------------------------------------------------
            'ウィンドウのメニューバーを再描画する関数
            'hWnd               :メニューバーを再描画するべき 1 つのウィンドウのハンドルを指定します。
            '戻り値          :成功すれば1、失敗すれば0がかえる。
            #If VBA7 Then
                Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long
            #Else
                Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
            #End If

ShellExecuteA関数

fileOPENは、拡張子に関連付けされたアプリケーションで開きます。URLであればブラウザで開きます。

構文C++
HINSTANCE ShellExecuteA( HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd );
パラメーター
    Hwnd           親ウィンドウのハンドル
            lpOperation    実行するアクションを指定する文字列
                "open"         指定したファイルを開きます
                "Print"        指定したファイルを印刷します(文書ファイルのみ)
                "explore"      指定したフォルダをエクスプローラで開きます
                "Edit"         指定したフォルダをエディターを起動し、ドキュメントを編集用に開きます(文書ファイルのみ)
            lpFile         ファイルパス文字列
            lpParameters   実行可能ファイルを指定する場合、アプリケーションに渡すパラメーターを指定する
            lpDirectory    作業ディレクトリの指定、この値がNULLの場合、現在の作業ディレクトリが使用されます
            nShowCmd       アプリケーションが開かれたときに表示される方法を指定するSW_フラグ
                SW_HIDE              0&   ウィンドウを非表示にして、別のウィンドウをアクティブにします
                SW_MAXIMIZE          3&   指定されたウィンドウを最大化します
                SW_MINIMIZE          6&   指定されたウィンドウを最小化し、zオーダーの次のトップレベルウィンドウをアクティブにします
                SW_RESTORE           9&   ウィンドウをアクティブにして表示して、ウィンドウが最小化または最大化されている場合、元のサイズと位置に復元します
                SW_SHOW              5&   ウィンドウをアクティブにし、現在のサイズと位置で表示します
                SW_SHOWDEFAULT      10&   STARTUPINFO構造体で指定されたSW_フラグに基づいて、表示状態を設定します
                SW_SHOWMAXIMIZED     3&   ウィンドウをアクティブにして、最大化して表示します
                SW_SHOWMINIMIZED     2&   ウィンドウをアクティブにして、最小化して表示します
                SW_SHOWMINNOACTIVE   7&   ウィンドウを最小化されたウィンドウとして表示します
                SW_SHOWNA            8&   ウィンドウを現在の状態で表示します
                SW_SHOWNOACTIVATE    4&   ウィンドウを最新のサイズと位置で表示します
パラメーター

関数が成功した場合、32より大きい値を返します。 関数が失敗した場合、失敗の原因を示すエラー値を返します

COPY

#If VBA7 And Win64 Then
            '64ビット版
            Public Declare PtrSafe Function ShellExecute _
                                    Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, _
                                                                             ByVal lpOperation As String, _
                                                                             ByVal lpFile As String, _
                                                                             ByVal lpParameters As String, _
                                                                             ByVal lpDirectory As String, _
                                                                             ByVal nShowCmd As Long) As LongPtr
        #Else
            '32ビット版
            Public Declare Function ShellExecute _
                                    Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
                                                                             ByVal lpOperation As String, _
                                                                             ByVal lpFile As String, _
                                                                             ByVal lpParameters As String, _
                                                                             ByVal lpDirectory As String, _
                                                                             ByVal nShowCmd As Long) As Long
        #End If

GetDesktopWindow関数

デスクトップウィンドウのハンドルを取得します。デスクトップウィンドウはスクリーン全体を覆っており、この上にアイコンやウィンドウなどが描画されます。


 
    

COPY

#If VBA7 And Win64 Then
            '64ビット版
            Public Declare PtrSafe Function GetDesktopWindow Lib "USER32" () As LongPtr
        #Else
            '32ビット版
            Public Declare Function GetDesktopWindow Lib "USER32" () As Long
        #End If

Message

下記の標準モジュールの名前です。いろいろなWinAPI32の関数を数多く使用しています。使い方が集約されていますので、参考になります。


 
    

COPY

Private Sub CommandButton1_Click()

            '-----ボタンのキャプション、戻り値をセット
            Message.ID = 0
            Message.Title = "検索エンジンの選択"
            Message.Item1 = "Google"
            Message.Item2 = "DuckDuckGo"
            Message.Item3 = "Yahoo"
            Message.Res1 = "http://www.google.co.jp/"
            Message.Res2 = "https://duckduckgo.com/"
            Message.Res3 = "http://www.yahoo.co.jp/"
        
            If Not fileOPEN(myMsgBox) Then
                MsgBox "開くことができません"
            End If
            
        End Sub

最初クラスを作ろうとして、 SetTimer のコールバック関数を AddressOf TimerProc で指定しましたが、EXCEL から「 AddressOf 演算子の使い方が正しくありません」と警告されてしましました。調べてみると「クラス メソッドの名前に AddressOf を使用しようとしました。 AddressOf で変更できるのは、 .bas モジュール内の Visual Basic プロシージャの名前のみです。クラス メソッドを指定することはできません。」(https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/invalid-use-of-addressof-operator)とのことでした。それで、このような形にしました。 Copy to clipboard


 
    

COPY

Option Explicit
            '----------------------------------------------------------------------
            Private LngID       As Long
            Private mTitle      As String
            Private mItem1      As String
            Private mItem2      As String
            Private mItem3      As String
            Private mRes1       As Variant
            Private mRes2       As Variant
            Private mRes3       As Variant
            '----------------------------------------------------------------------
            Public Property Let ID(ByVal Val As Long)
                LngID = Val
            End Property
            
            Public Property Let Title(ByVal Val As String)
                mTitle = Val
            End Property
            
            Public Property Let Item1(ByVal Val As String)
                mItem1 = Val
            End Property
            
            Public Property Let Item2(ByVal Val As String)
                mItem2 = Val
            End Property
            
            Public Property Let Item3(ByVal Val As String)
                mItem3 = Val
            End Property
            
            Public Property Let Res1(ByVal Val As String)
                mRes1 = Val
            End Property
            
            Public Property Let Res2(ByVal Val As String)
                mRes2 = Val
            End Property
            
            Public Property Let Res3(ByVal Val As String)
                mRes3 = Val
            End Property
            '----------------------------------------------------------------------
            Private Sub Initialize()
            
                If IsEmpty(LngID) Then LngID = 0
                If IsEmpty(mTitle) Then mTitle = "確認"
                If IsEmpty(mItem1) Then mItem1 = "確認"
                If IsEmpty(mItem2) Then mItem2 = ""
                If IsEmpty(mItem3) Then mItem3 = ""
                If IsEmpty(mRes1) Then mRes1 = vbOK
                If IsEmpty(mRes2) Then mRes2 = ""
                If IsEmpty(mRes3) Then mRes3 = ""
            
            End Sub
            '----------------------------------------------------------------------
            Public Function myMsgBox() As Variant
                Dim iCount      As Long
                Dim Buttons     As Variant
                Dim lngRtn      As Long
                Dim varBUF      As Variant
                
                Call Initialize
                
                '-----キャプションの調整
                iCount = 0
                
                If mItem1 <> "" And mRes1 <> "" Then
                    iCount = iCount + 1
                End If
                
                If mItem2 <> "" And mRes2 <> "" Then
                    iCount = iCount + 1
                    If iCount = 1 Then
                        mItem1 = mItem2
                        mRes1 = mRes2
                        mItem2 = ""
                        mRes2 = ""
                    End If
                End If
                
                If mItem3 <> "" Or mRes3 <> "" Then
                    iCount = iCount + 1
                    If iCount = 1 Then
                        mItem1 = mItem3
                        mRes1 = mRes3
                        mItem3 = ""
                        mRes3 = ""
                    ElseIf iCount = 2 Then
                        mItem2 = mItem3
                        mRes2 = mRes3
                        mItem3 = ""
                        mRes3 = ""
                    End If
                End If
                
                '-----ボタンのキャプションの数に応じてボタンを指定する
                If iCount = 3 Then
                    Buttons = vbYesNoCancel
                ElseIf iCount = 2 Then
                    Buttons = vbYesNo
                ElseIf iCount = 1 Then
                    Buttons = vbOK
                End If
                
                '-----タイマーをスタート
                Call Timer_Start
            
                '-----メッセージボックスを開きます
                lngRtn = MessageBox(Application.hWnd, "検索エンジンを選択してください", mTitle, Buttons)
            
                Select Case lngRtn
                Case vbYes
                    varBUF = mRes1
                Case vbNo
                    varBUF = mRes2
                Case vbCancel
                    varBUF = mRes3
                Case vbOK
                    varBUF = mRes1
                End Select
                
                '-----値を返す
                myMsgBox = varBUF
                
            End Function
            '----------------------------------------------------------------------
            Public Sub TimerProc(ByVal hWnd As LongPtr, _
                                 ByVal uMsg As Long, _
                                 ByVal idEvent As Long, _
                                 ByVal dwTime As Long)
                Dim dlghWnd     As Long
                Dim btn1hWnd    As Long
                Dim btn2hWnd    As Long
                Dim btn3hWnd    As Long
            
                Timer_End       'タイマーを切ります
                    
                '-----実行時エラーが発生してもプログラムを中断せず、次のステートメントから実行を継続
                On Error Resume Next
            
                '-----システムボックスを非表示にします
                Call LsSetWindowLong(mTitle, "無効")
                
                '-----[閉じる]ボタンを無効にする
                Call LsDeleteMenu(mTitle, "無効")
                
                'dlghWnd = FindWindow("#32770", mTitle)
                dlghWnd = FindWindowEx(0&, 0&, "#32770", mTitle)
            
                '-----[はい]ボタンの表示を変更する
                btn1hWnd = FindWindowEx(dlghWnd, 0&, "Button", "はい(&Y)")
                If btn1hWnd <> 0& Then
                    Call SendMessage(btn1hWnd, WM_SETTEXT, 0, ByVal mItem1)
                    'Call SetWindowText(btn1hWnd, mItem1) でも可
                End If
            
                '-----[いいえ]ボタンの表示を変更する
                btn2hWnd = FindWindowEx(dlghWnd, 0&, "Button", "いいえ(&N)")
                If btn2hWnd <> 0& Then
                    Call SendMessage(btn2hWnd, WM_SETTEXT, 0, ByVal mItem2)
                    'Call SetWindowText(btn2hWnd, mItem2) でも可
                End If
                
                '-----[キャンセル]ボタンの表示を変更する
                btn3hWnd = FindWindowEx(dlghWnd, 0&, "Button", "キャンセル")
                If btn3hWnd <> 0& Then
                    Call SendMessage(btn3hWnd, WM_SETTEXT, 0, ByVal mItem3)
                    'Call SetWindowText(btn3hWnd, mItem3) でも可
                End If
            
            End Sub
            '----------------------------------------------------------------------
            Private Sub Timer_Start()
            
                If LngID = 0 Then
                    LngID = SetTimer(0&, 0&, 0&, AddressOf TimerProc)
                End If
                
            End Sub
            '----------------------------------------------------------------------
            Private Sub Timer_End()
            
                If LngID <> 0 Then
                    Call KillTimer(0&, LngID)
                    LngID = 0
                End If
                
            End Sub
            '----------------------------------------------------------------------
            'コントロールメニューを有効/無効
            Private Sub LsSetWindowLong(strCaption As String, FLG As String)
                Dim hWnd                As Long
                Dim lngGetWindowLong    As Long
            
                '-----ウィンドウのハンドルを取得(vbNullString:VBAで定義された定数 値 0 を持つ文字列)
                hWnd = FindWindow(vbNullString, strCaption)
            
                 '-----ウィンドウに関する情報を取得
                lngGetWindowLong = GetWindowLong(hWnd, GWL_STYLE)
                
                If FLG = "無効" Then
                    lngGetWindowLong = lngGetWindowLong And (Not WS_SYSMENU)
                Else
                    lngGetWindowLong = lngGetWindowLong Or WS_SYSMENU
                End If
                
                '-----ウィンドウの属性を変更
                Call SetWindowLong(hWnd, GWL_STYLE, lngGetWindowLong)
            
            End Sub
                                        
            '----------------------------------------------------------------------
            'コントロールメニュー[×]ボタンを有効/無効
            Private Sub LsDeleteMenu(strCaption As String, FLG As String)
                Dim hWnd            As Long
                Dim hMenu           As Long
            
                '-----ウィンドウのハンドルを取得(vbNullString:VBAで定義された定数 値 0 を持つ文字列)
                hWnd = FindWindow(vbNullString, strCaption)
                
                If FLG = "無効" Then
                    '-----ウィンドウに関する情報を取得
                    hMenu = GetSystemMenu(hWnd, 0&)
                    '-----[閉じる]ボタンを無効にする
                    Call DeleteMenu(hMenu, SC_CLOSE And SC_MINIMIZE And SC_RESTORE, MF_BYCOMMAND)
                Else
                    '-----ウィンドウメニューをリセットする
                    hMenu = GetSystemMenu(hWnd, 1&)
                End If
            
                '-----ウィンドウのメニューバーを再描画
                Call DrawMenuBar(hWnd)
            
            End Sub

fileOPENは、拡張子に関連付けされたアプリケーションで開きます。URLであればブラウザで開きます。

構文C++



    

COPY



    



    

COPY



    



    

COPY



    



    

COPY