
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
APIでフォルダの選択のダイアログを表示し、コールバック関数の中で、自力で書き換えるしかないように思います。
FolderBrowserDialogクラス
に似せた
FolderBrowserDlgクラス
を自作してみました。
注意
※サンプルですので、バグがあっても、見なかったことにしてください。
※OSがWin98以下でも使用する場合は、サンプルのBIF_XXXX系のパラメータの一部が使用できません。
ですので、Win98以下の環境でも稼動をサポートするのであれば、それようのコードを追加しなければなりません。
こういう制限があることを承知でダイアログタイトルを変更したいのであれば、どうぞサンプルを流用してください。
私なら、もしこれが業務アプリならば、ここまでやらなければいけないタイトルの変更は避けます。
'----------------------------------------
'クラス:FolderBrowserDlg
'----------------------------------------
Imports System.Runtime.InteropServices
Public Class FolderBrowserDlg
#Region "宣言"
#Region "フォルダ表示APIのコールバック用"
Private Delegate Function BFFCALLBACK(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal lParam As IntPtr, ByVal lpData As IntPtr) As Integer
#End Region
#Region "API関連"
Private Const MAX_PATH As Integer = 260
Private Const BFFM_INITIALIZED As Integer = 1
Private Const BFFM_SELCHANGED As Integer = 2
Private Const BFFM_VALIDATEFAILED As Integer = 3
Private Const WM_USER As Integer = &H400
Private Const BFFM_SETSTATUSTEXTA As Integer = (WM_USER + 100)
Private Const BFFM_ENABLEOK As Integer = (WM_USER + 101)
Private Const BFFM_SETSELECTION As Integer = (WM_USER + 102)
Private Enum BIF
BIF_RETURNONLYFSDIRS = &H1
BIF_DONTGOBELOWDOMAIN = &H2
BIF_STATUSTEXT = &H4
BIF_RETURNFSANCESTORS = &H8
BIF_EDITBOX = &H10
BIF_VALIDATE = &H20
BIF_NEWDIALOGSTYLE = &H40
BIF_USENEWUI = &H50
BIF_BROWSEINCLUDEURLS = &H80
BIF_UAHINT = &H100
BIF_NONEWFOLDERBUTTON = &H200
BIF_NOTRANSLATETARGETS = &H400
BIF_BROWSEFORCOMPUTER = &H1000
BIF_BROWSEFORPRINTER = &H2000
BIF_BROWSEINCLUDEFILES = &H4000
BIF_SHAREABLE = &H8000
End Enum
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Private Structure BROWSEINFO
Public hWndOwner As IntPtr
Public pidlRoot As System.Environment.SpecialFolder
Public pszDisplayName As IntPtr
<MarshalAs(UnmanagedType.LPTStr)> Public lpszTitle As String
Public ulFlags As BIF
<MarshalAs(UnmanagedType.FunctionPtr)> Public lpfn As BFFCALLBACK
Public lParam As IntPtr
Public iImage As Integer
End Structure
<DllImport("shell32.dll", CharSet:=CharSet.Auto)> Private Shared Function SHBrowseForFolder(ByRef bi As BROWSEINFO) As IntPtr
End Function
<DllImport("shell32.dll", CharSet:=CharSet.Auto)> Private Shared Function SHGetPathFromIDList(ByVal pidl As IntPtr, ByVal pszPath As System.Text.StringBuilder) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As System.Text.StringBuilder) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> Private Shared Function SetWindowText(ByVal hWnd As IntPtr, ByVal lpString As System.Text.StringBuilder) As Integer
End Function
#End Region
#End Region
Private udtBrowseInfo As BROWSEINFO = New BROWSEINFO
#Region "インストラクタ"
''' <summary>
''' インストラクタ
''' </summary>
''' <remarks></remarks>
Public Sub New()
With Me
.RootFolder = Environment.SpecialFolder.Desktop
.Description = "解説文"
.SelectedPath = ""
End With
With udtBrowseInfo
.ulFlags = BIF.BIF_RETURNONLYFSDIRS Or BIF.BIF_NEWDIALOGSTYLE
.lpfn = AddressOf BrowseCallbackProc
.lParam = IntPtr.Zero
.iImage = 0
End With
End Sub
#End Region
#Region "ダイアログの表示"
''' <summary>
''' ダイアログの表示
''' </summary>
''' <param name="owner"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function ShowDialog(ByVal owner As System.Windows.Forms.IWin32Window) As Windows.Forms.DialogResult
Dim l_dlgRet As Windows.Forms.DialogResult = DialogResult.Cancel
With udtBrowseInfo
'ベースとなる親ハンドル
.hWndOwner = owner.Handle
End With
Dim lngRetValue As IntPtr = SHBrowseForFolder(udtBrowseInfo)
If lngRetValue.Equals(IntPtr.Zero) Then
GoTo PGMEND
End If
Dim l_strパス As String = ""
取得_選択フォルダ(lngRetValue, l_strパス)
Me.SelectedPath = l_strパス
l_dlgRet = DialogResult.OK
PGMEND:
Return l_dlgRet
End Function
#End Region
#Region "プロパティ"
#Region "プロパティ:ダイアログルート"
''' <summary>
''' ダイアログルート
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property RootFolder() As System.Environment.SpecialFolder
Get
Return Me.udtBrowseInfo.pidlRoot
End Get
Set(ByVal value As System.Environment.SpecialFolder)
Me.udtBrowseInfo.pidlRoot = value
End Set
End Property
#End Region
#Region "プロパティ:新規フォルダ作成ボタンの表示/非表示"
''' <summary>
''' 新規フォルダ作成ボタンの表示/非表示
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property ShowNewFolderButton() As Boolean
Get
Return (Me.udtBrowseInfo.ulFlags And BIF.BIF_NONEWFOLDERBUTTON) = 0
End Get
Set(ByVal value As Boolean)
If value Then
Me.udtBrowseInfo.ulFlags = Me.udtBrowseInfo.ulFlags And Not BIF.BIF_NONEWFOLDERBUTTON
Else
Me.udtBrowseInfo.ulFlags = Me.udtBrowseInfo.ulFlags Or BIF.BIF_NONEWFOLDERBUTTON
End If
End Set
End Property
#End Region
#Region "プロパティ:エディットコントロールの表示の表示/非表示"
''' <summary>
''' エディットコントロールの表示の表示/非表示
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property ShowEditBox() As Boolean
Get
Return (Me.udtBrowseInfo.ulFlags And BIF.BIF_EDITBOX) = BIF.BIF_EDITBOX
End Get
Set(ByVal value As Boolean)
If value Then
Me.udtBrowseInfo.ulFlags = Me.udtBrowseInfo.ulFlags Or BIF.BIF_EDITBOX
Else
Me.udtBrowseInfo.ulFlags = Me.udtBrowseInfo.ulFlags And Not BIF.BIF_EDITBOX
End If
End Set
End Property
#End Region
#Region "プロパティ:解説文"
''' <summary>
''' 解説文
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Description() As String
Get
Dim l_sb As New System.Text.StringBuilder(Me.udtBrowseInfo.lpszTitle)
Return l_sb.ToString()
End Get
Set(ByVal value As String)
Dim l_sb As New System.Text.StringBuilder(value)
Me.udtBrowseInfo.lpszTitle = l_sb.ToString() & vbNullChar
End Set
End Property
#End Region
#Region "プロパティ:選択パス"
Private m_strSelectedPath As String = ""
''' <summary>
''' 選択パス
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property SelectedPath() As String
Get
Return m_strSelectedPath
End Get
Set(ByVal value As String)
m_strSelectedPath = value
End Set
End Property
#End Region
#Region "プロパティ:タイトル"
Private m_strTitle As String = ""
''' <summary>
''' タイトル
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Title() As String
Get
Return m_strTitle
End Get
Set(ByVal value As String)
m_strTitle = value
End Set
End Property
#End Region
#End Region
#Region "コールバック関数"
''' <summary>
''' コールバック関数
''' </summary>
''' <param name="hwnd"></param>
''' <param name="uMsg"></param>
''' <param name="lParam"></param>
''' <param name="lpData"></param>
''' <returns></returns>
''' <remarks>APIでフォルダ選択を表示する構造体に、以下の関数ポインタを設定することにより、呼び出される</remarks>
Private Function BrowseCallbackProc(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal lParam As IntPtr, ByVal lpData As IntPtr) As Integer
Select Case uMsg
Case BFFM_INITIALIZED
'-- タイトル指定の設定
If (Me.Title.Length > 0) Then
Call SetWindowText(hwnd, New System.Text.StringBuilder(Me.Title))
End If
'-- 初期フォルダの設定
If (Me.SelectedPath.Length > 0) Then
Dim l_strパス As String = Me.SelectedPath & vbNullChar
Dim bytPortName() As Byte = System.Text.Encoding.Default.GetBytes(l_strパス)
Dim gch As GCHandle = GCHandle.Alloc(bytPortName, GCHandleType.Pinned)
Call SendMessage(hwnd, BFFM_SETSELECTION, 1, gch.AddrOfPinnedObject())
gch.Free()
End If
Case BFFM_SELCHANGED
'.ulFlags にBIF_NEWDIALOGSTYLEを設定すると、存在しないフォルダでも、OKボタンを押せてしまうのを防ぐ対応
If Not 取得_選択フォルダ(lParam) Then
Call SendMessage(hwnd, BFFM_ENABLEOK, 0, 0)
End If
End Select
End Function
#End Region
#Region "選択フォルダ取得関数"
''' <summary>
''' 取得_選択フォルダ
''' </summary>
''' <param name="pidl"></param>
''' <param name="p_strパス"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function 取得_選択フォルダ(ByVal pidl As IntPtr, ByRef p_strパス As String) As Boolean
Dim l_blnRet As Boolean
' 現在選択されているフォルダのパスを得る。
Dim l_sb As New System.Text.StringBuilder(MAX_PATH)
Dim l_intResult As Integer = SHGetPathFromIDList(pidl, l_sb)
If (l_intResult <> 0) Then
p_strパス = l_sb.ToString()
l_blnRet = True
End If
Return l_blnRet
End Function
Private Function 取得_選択フォルダ(ByVal pidl As IntPtr) As Boolean
Return 取得_選択フォルダ(pidl, "")
End Function
#End Region
End Class
'----------------------------------------
'フォーム:Form1
'----------------------------------------
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim l_obj As New FolderBrowserDlg()
l_obj.Title = "ダイアログのタイトル"
l_obj.Description = "フォルダの選択をさせるための説明"
l_obj.SelectedPath = "C:\Program Files"
'新規フォルダボタン
l_obj.ShowNewFolderButton = False
'エディットコントロールの表示
l_obj.ShowEditBox = True
'フォルダ選択を表示
If l_obj.ShowDialog(Me) = DialogResult.OK Then
'取得結果
MsgBox(l_obj.SelectedPath)
End If
End Sub
End Class
回答ありがとうございます
タイトル変えるだけでこんなに大変なことになるならあきらめます。
大変ご苦労かけましてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Windows 10 フォルダアイコンをパワーポイントなどで自作するには? 2 2022/06/21 18:54
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- C言語・C++・C# Seleniumで「ファイルを開く」ダイアログボックスのフォルダ指定する方法を教えてください。 1 2022/05/09 07:38
- Excel(エクセル) 1つのファイルを3つのフォルダにファイル名を【明日の日付】にして、コピーをしたい 2 2022/12/21 17:43
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) VBAの参照先のファイル名をセルに書いて代入したい 2 2022/04/04 13:42
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 最新のフォルダ取得
-
Windows10でコマンドプロンプト...
-
VB.NRT FolderBrowserDialogを...
-
フォルダの検索2
-
VB.NETでツリービューにフォル...
-
VBプロジェクトでのフォルダ構...
-
エクセル VBA Filename:=Left(T...
-
フォルダを開く
-
フォルダの検索
-
ディレクトリ名変更してコピー...
-
ファイル名と同名のフォルダを...
-
【ExcelVBA】一覧表の記載に従...
-
【VBS】古い日付のフォルダを削...
-
VBA フォルダ名に特定の文字を...
-
Excelで指定したフォルダに保存...
-
フォルダにリンクを貼りたい
-
フォルダAから1つのファイルだ...
-
【VC++6.0(MFC)】適切なSHBrows...
-
VBA フォルダの複数選択ができない
-
SHBrowseforfolderについて質問...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
会社のネットワーク上のファイ...
-
パス名に2バイト文字(マルチバ...
-
デスクトップの画像をhtmlに表...
-
【マクロ】ファイル名の日付に...
-
C ファイル出力で、フォルダが...
-
ファイル名と同名のフォルダを...
-
Excelのハイパーリンクについて...
-
VBA 最新のフォルダ取得
-
Excelで指定したフォルダに保存...
-
VBAでファイル名を指定して保存...
-
Access VBA で フォルダ権限...
-
サーバ内のフォルダ名と各フォ...
-
excelマクロ 冒頭3文字が一致す...
-
VBA フォルダ名に特定の文字を...
-
カレントフォルダって?
-
Excel VBA マクロ フォルダ名を...
-
VBA フォルダの複数選択ができない
-
ExcelVBAでフォルダへのハイパ...
-
ExcelのVBAでフォルダ指定がで...
おすすめ情報