ユーティリティ系のプログラムだと、 指定されたファイルのフォルダや、指定されたファイルそのものを開きたいことがあります。 指定されたファイルを開く場合は、(拡張子に)関連付けられているプログラムで、簡単に開けます。
また、ブラウザでウェブサイトを開きたい場合や、 指定のファイルが選択された状態で、エクスプローラーでフォルダを開く場合のコードも、書いています。
2021 年 2 月、ページの様式を変更し、2セクションを追加しています。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
投稿 November 15, 2018
重複ファイルを検出する DupliFileDetector ユーティリティでは、 重複ファイルの詳細ダイアログで、「フォルダを開く」ボタンを押すと、 そのファイルのあるフォルダを開けます。
次のコードは、strFolder にフォルダ名(フルパスを想定しています)が入っているとして、 そのフォルダを開くコードです。
// strFolder にフルパスを設定します(例です)。 CString strFolder; strFolder = _T("C:\\data"); ShellExecute(GetSafeHwnd(), _T("open"), strFolder, NULL, strFolder, SW_SHOW);
_T マクロは、
方法としては、コードの通り、ShellExecute API に、open コマンドとフォルダ名を渡して、それを開いています。 エクスプローラーでファイルを右クリックして、「開く」を選んでいるのと同じ動作となりますが、 指定がフォルダなので、フォルダが開かれている、ということです。
投稿 November 15, 2018
重複ファイルを検出する DupliFileDetector ユーティリティでは、 重複ファイルの詳細ダイアログに表示されたファイルをダブルクリックすると、そのファイルを開きます。 開くプログラムは、拡張子に関連付けられているものになります。
// strFolder にパスを、strFile にファイル名を設定します(例です)。 CString strFolder, strFile; strFolder = _T("C:\\data"); strFile = _T("C:\\data\\readme.txt"); ShellExecute(GetSafeHwnd(), _T("open"), strFile, NULL, strFolder, SW_SHOW);
フォルダを開く場合と比べ、パラメータがファイル名(フルパス)になっている部分が異なるだけです。
エクスプローラーで右クリックから「開く」を選んだ動作と同じになります。 基本的には、ファイルのダブルクリックとも同じ動作になるようです。
.txt ならテキストエディタで、 .jpg や .bmp ならフォトで、 .wmv や .mp4 ならビデオプレーヤーで、 .docx ならワードで、のように、関連付けられたプログラムが使われます。
投稿 February 16, 2021
追記です。 コードが散らばってしまったので、オープン系のコードをこのページにまとめておこうと思います。
ファイルを開く場合と同じと言えば同じですが、 ウェブサイトを開きたい場合のコードです。
ShellExecute(GetSafeHwnd(), _T("open"), _T("https://www.straightapps.com/win/"), NULL, NULL, SW_SHOWNORMAL);
ファイル名に開きたい URL 文字列を渡し、open コマンドで開きます。 作業フォルダは必要ないため、NULL にしています。
ちなみに、ダイアログ内にテキストコントロールを置き、
投稿 February 16, 2021
あるファイルに注目して、エクスプローラーでフォルダを開きたいとき、 ファイルを選択した状態でフォルダを開くこともできます。
CString str, strFile; strFile = _T("C:\\data\\readme.txt"); str.Format(_T("explorer.exe /e, /select, %s"), strFile); WinExec(str, SW_SHOW);
エクスプローラーは Windows フォルダにあるシステムプログラムで、パスは通っていますから、 このように起動しても問題ありません。
/e オプションは、ウィンドウの左側にフォルダツリーを表示する指定です。 これがなければ、「フォルダを開いた」ような感じになります。
/select オプションは、そのファイルを選択状態とする指定です。
Visual C++ の古いプロジェクトで sprintf 関数を利用していると、 VC++ 2015 以降 ではリンクエラーになってしまいます。 この回避方法について、書いています。
Windows 操作と開発に関する記事をまとめた Windows 開発トップ もご覧ください。