ShellExecuteでのファイルオープン

ShellExecute()を使うと、指定したファイルを「オープン」したり、他のプログラムを引数付きで起動する事が出来ます。この機能を使うと、例えばインストールプログラムの開発ではインストール完了時にドキュメントを自動的に表示する、といった事も出来るでしょう。あるいは、ランチャーソフトを開発する時にも使えるかもしれません。

・ファイルlpszFnを開く例
ShellExecute(NULL,"open",lpszFn,NULL,NULL,SW_SHOWNORMAL);

・ファイルlpszFnをノートパッドで開く例
ShellExecute(NULL,NULL,"notepad",lpszFn,NULL,SW_SHOWNORMAL);

 オープンする時には、2番目の引数「オペレーション」指定にopenを、3番目の引数にファイル名へのポインタを設定します。最後の引数は、ファイルを開いたアプリケーションの表示状態ですが、通常の状態で開くのならSW_SHOWNORMALを指定しておけば良いでしょう。これで、指定したファイルタイプに関連付けられたアプリケーションを起動し、指定したファイルを開けます。
 アプリケーションを指定してファイルを開く時には、オペレーションはNULLでファイル名にアプリケーションのファイル名を入れます。ファイル名だけでも、パスが通っていれば大丈夫みたいですね。4番目の引数がアプリケーションに渡すパラメータで、ここに開くファイルを指定する事になります。なお、当然の事ながらアプリケーションにはパラメータとしてファイル名以外のものも渡せるので、アプリケーションのファイル名やパスが分かっていれば「何でもあり」になります。アプリケーションの種類によっては、ShellExecute()を呼び出す前にパラメータを確認する必要が出てくるでしょう。

 ShellExecute()では、2番目の引数で操作を指定しますが、ここでは「print」「explore」も指定出来ます。exploreを指定すると、指定フォルダをエクスプローラで開くようですね。

・フォルダlpszFnをエクスプローラで開く例
ShellExecute(NULL,"explore",lpszFn,NULL,NULL,SW_SHOWNORMAL);

 シェル関連のAPIには、他にもいろいろな機能があるので調べてみると面白いと思います。

プログラム

 メニューで操作を指定してファイルをドロップしてください。openなら、関連付けられたアプリケーションで、NotePadならノートパッドで開きます。メニューはコンボボックスでドロップメニューとして作り、選択された項目はコンボボックスにCB_GETCURSELメッセージを送って取得するようにしました。

・コンボボックスの作成
  hwMenu=CreateWindow("COMBOBOX","LIST", /* コンボボックス */
    WS_CHILD | WS_VISIBLE | WS_BORDER |CBS_DROPDOWNLIST,
    8,8,128,128,hwnd,(HMENU)0,hInst,NULL);

  /* コンボボックスに項目追加 */
  SendMessage(hwMenu,CB_ADDSTRING,0,(LPARAM)"Open");
  SendMessage(hwMenu,CB_ADDSTRING,0,(LPARAM)"Notepad");

  /* デフォルトの項目設定 */
  SendMessage(hwMenu,CB_SELECTSTRING,0,(LPARAM)"Open");

 ファイルがドロップされたら、そのファイル名とコンボボックスの選択項目を引数にファイルをオープンする関数openFile()を呼び出します。

  case WM_DROPFILES: /* ファイルがドロップされた時の処理 */

      hDrop=(HDROP)wParam; /* HDROPを取得 */
      DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */

      openFile(lpszFn,SendMessage(hwMenu,CB_GETCURSEL,0,0));

      DragFinish(hDrop); /* ドラッグ&ドロップ終了処理 */

      break;


・openFile

  void openFile(LPBYTE lpszFn,int m) { /* ShellExecute()でファイルを開く */

      if (m==0) /* 関連付けられたアプリケーションでファイルを開く */
          ShellExecute(NULL,"open",lpszFn,NULL,NULL,SW_SHOWNORMAL);
      else /* NotePadでファイルを開く */
          ShellExecute(NULL,NULL,"notepad",lpszFn,NULL,SW_SHOWNORMAL);

  }

プログラムソース表示


Windowsプログラミング実験室 > プログラミング資料庫