デスクトップやマイドキュメントなどの、特殊フォルダのパスを取得する方法はありますか?
マイドキュメントに自動保存などの機能を付けたいのでできたら教えてください。
特殊フォルダの取得
Re: 特殊フォルダの取得
> デスクトップやマイドキュメントなどの、特殊フォルダのパスを取得する方法はありますか?
> マイドキュメントに自動保存などの機能を付けたいのでできたら教えてください。
ほとんどコピペですが…
SHGetSpecialFolderPath() というのを使います。
知りたい場合はそちらをご覧ください。
参考:
SPIRIT さんの WinTips
WinAPI Database for VB Programmer
> マイドキュメントに自動保存などの機能を付けたいのでできたら教えてください。
ほとんどコピペですが…
SHGetSpecialFolderPath() というのを使います。
宣言と定数 [ここをクリックすると内容が表示されます]
コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As Long,_
lpszPath As String,nFolder As Long,fCreate As Long) As Long
Const CSIDL_DESKTOP = &H0 'デスクトップ
Const CSIDL_STARTUP = &H7 'スタートアップ
Const CSIDL_PERSONAL = &H5 'マイドキュメント
Const CSIDL_FAVORITIES = &H6 'お気に入り
Const CSIDL_RECENT = &H8 '最近使ったファイルのフォルダ
使い方 [ここをクリックすると内容が表示されます]
他の定数は参考の二つ目のサイトに載ってますので、コード: 全て選択
'マイドキュメントを取得する
Dim buf As String
buf = String$(255, Chr$(0))
SHGetSpecialFolder(GetDesktopWindow(), _ ' ダイアログボックスを所有させるウィンドウハンドル
buf, _ 'フルパスを渡す変数
CSIDL_PERSONAL, _ ' 特殊フォルダの定数
FALSE)
MessageBox(0, buf, "マイドキュメントのパス", MB_OK)
知りたい場合はそちらをご覧ください。
参考:
SPIRIT さんの WinTips
WinAPI Database for VB Programmer
最後に編集したユーザー M.S. [ 2008年8月11日(月) 15:54 ], 累計 1 回
ダイアログボックスより上に来るのがまずいウインドウのハンドル という感覚で指定してます。間違ってるかもしれませんが・・・
「使い方」にあるように、GetDesktopWindow()でもいいと思いますし、
プロジェクトならhMainWnd等でいいと思います。
でもこの「使い方」のString型の使用方法はAB3時代の物のように思えます・・・
このまま流用する時は引数bufをStrPtrでくくるか、
自信があるようならString型を使わずに*Byte型やByte型配列を用いるほうがいいと思います。
「使い方」にあるように、GetDesktopWindow()でもいいと思いますし、
プロジェクトならhMainWnd等でいいと思います。
でもこの「使い方」のString型の使用方法はAB3時代の物のように思えます・・・
このまま流用する時は引数bufをStrPtrでくくるか、
自信があるようならString型を使わずに*Byte型やByte型配列を用いるほうがいいと思います。
つまりAB4用だとこんな具合 [ここをクリックすると内容が表示されます]
コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As HWND,_
lpszPath As *Byte,nFolder As Long,fCreate As Long) As Long
Const CSIDL_ALTSTARTUP = &H1D ' スタートアッププログラムグループ内の特定ユーザー向けのスタートアップディレクトリ
Const CSIDL_APPDATA = &H1A ' アプリケーション定義データ用共通ディレクトリ
Const CSIDL_BITBUCKET = &H0A ' ごみ箱
Const CSIDL_COMMON_ALTSTARTUP = &H1E ' スタートアッププログラムグループ内の全ユーザー向けのスタートアップディレクトリ
Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' 全ユーザ向けデスクトップディレクトリ
Const CSIDL_COMMON_FAVORITES = &H1F ' 全ユーザ向けお気に入り
Const CSIDL_COMMON_PROGRAMS = &H17 ' 全ユーザ向けスタートメニューに表示されるプログラムグループのディレクトリ
Const CSIDL_COMMON_STARTMENU = &H16 ' 全ユーザ向けスタートメニューに表示されるプログラムとフォルダを含むのディレクトリ
Const CSIDL_COMMON_STARTUP = &H18 ' 全ユーザ向けスタートアップフォルダに含まれるプログラムを含むのディレクトリ
Const CSIDL_CONTROLS = &H03 ' コントロールパネル
Const CSIDL_DESKTOP = &H00 ' デスクトップ
Const CSIDL_DESKTOPDIRECTORY = &H10 ' Windows\デスクトップ
Const CSIDL_DRIVES = &H11 ' マイコンピュータ
Const CSIDL_FAVORITIES = &H06 ' Favorities
Const CSIDL_FONTS = &H14 ' Windows\Font
Const CSIDL_HISTORY = &H22 ' インターネット履歴ディレクトリ
Const CSIDL_INTERNET = &H01 ' インターネットフォルダ
Const CSIDL_INTERNET_CACHE = &H20 ' インターネットキャッシュのディレクトリ
Const CSIDL_NETHOOD = &H13 ' NetHoodディレクトリ
Const CSIDL_NETWORK = &H12 ' NETWORKフォルダ
Const CSIDL_PERSONAL = &H05 ' My Document
Const CSIDL_PRINTERS = &H04 ' プリンタフォルダ
Const CSIDL_PRINTERHOOD = &H1B ' プリンタディレクトリ
Const CSIDL_PROGRAMS = &H02 ' \windows\プログラム
Const CSIDL_RECENT = &H08 ' Recent
Const CSIDL_SENDTO = &H09 ' SendTo
Const CSIDL_STARTMENU = &H0B ' スタートメニュー
Const CSIDL_STARTUP = &H07 ' スタートアップ
Const CSIDL_TEMPLATES = &H15 ' Windows\ShellNew
'定数宣言ここまで
#prompt
Dim buf As *Byte
buf=malloc(MAX_PATH)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_PERSONAL,FALSE)
Print "マイドキュメント:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_DESKTOP,FALSE)
Print "デスクトップ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FAVORITIES,FALSE)
Print "お気に入りフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FONTS,FALSE)
Print "フォントフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_STARTUP,FALSE)
Print "スタートアップフォルダ:";MakeStr(buf)
free(buf)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
GetDesktopWindowはだめです,絶対。hMainWndなど渡すものがなければNULLです。
この引数のウィンドウハンドルを使うときというのは,つまり親にしてダイアログを表示するときです。そのダイアログが表示されている間,親のウィンドウは無効化(操作できないように)されます(例えばProjectEditorでオプションや名前を付けて保存を表示している間,ファイルの編集ができないのもこのためです)。
もし,GetDesktopWindow()を渡してダイアログを表示しようとすると,デスクトップが操作できなくなる,つまり表示されているすべてのウィンドウが操作できなくなるという結論が導き出されてしまうのです。
現実には,誤ってGetDesktopWindow()を渡すプログラムが多かったため,GetDesktopWindow()が渡されたらNULLが渡されたかのように振る舞うようになっているのでそういうことにはなりませんが,だからと言ってGetDesktopWindow()を渡すことが正当化されるわけではありません。
参考: The Old New Thing : What's so special about the desktop window?
この引数のウィンドウハンドルを使うときというのは,つまり親にしてダイアログを表示するときです。そのダイアログが表示されている間,親のウィンドウは無効化(操作できないように)されます(例えばProjectEditorでオプションや名前を付けて保存を表示している間,ファイルの編集ができないのもこのためです)。
もし,GetDesktopWindow()を渡してダイアログを表示しようとすると,デスクトップが操作できなくなる,つまり表示されているすべてのウィンドウが操作できなくなるという結論が導き出されてしまうのです。
現実には,誤ってGetDesktopWindow()を渡すプログラムが多かったため,GetDesktopWindow()が渡されたらNULLが渡されたかのように振る舞うようになっているのでそういうことにはなりませんが,だからと言ってGetDesktopWindow()を渡すことが正当化されるわけではありません。
参考: The Old New Thing : What's so special about the desktop window?