MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCShellListCtrlでのフロッピーへのアクセス制限

 「CMFCShellListCtrl」クラスをデフォルトで使い、マイコンピュータ内を表示させるようにした場合(ParentFolderがNULL)に、フロッピードライブが取り付けてある環境の場合、表示するときにドライブへアクセスするため、あの独特のアクセス音が気になる場合があります。
 そういった場合に、表示時にはフロッピードライブへはアクセスしないようにし、ドライブ内を開こうとしたときにだけアクセスする方法を紹介します。

 まず、「CMFCShellListCtrl」を派生させたクラス(ここではCMyMFCShellListCtrl)を作り、そこで「EnumObjects」をオーバライドします。
 ヘッダファイルに以下を追加します。
    HRESULT EnumObjects(LPSHELLFOLDER pParentFolder, LPITEMIDLIST pidlParent);
 ここでcppファイルのコードなのですが、今回の方法は、コードをすべて掲載すると結構長くなるので、変更する箇所だけ掲載していきます。
 元になるコードは、「afxshelllistctrl.cpp」内の263行目以降を改良していきます。
 「afxshelllistctrl.cpp」ファイルは、「〜Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc」以下にあります。

 まず、「afxshelllistctrl.cpp」内の263行目以降にある「EnumObjects」関数をそのまま自分の派生クラスのcppファイルにコピペします。
 以下、関数内の一番上を1行目として、変更する箇所を書いていきます。
 1行目 CMFCShellListCtrl → CMyMFCShellListCtrl
 4行目 afxShellManager → theApp.GetShellManager()
31行目 afxShellManager → theApp.GetShellManager()
38行目以降に以下を追加、
            SHFILEINFO sfi;
            TCHAR szPath [MAX_PATH];

            if(SHGetPathFromIDList(pItem->pidlFQ, szPath))
            {
                if(DRIVE_REMOVABLE == GetDriveType(szPath))
                {
                    if(SHGetFileInfo((LPCTSTR)pItem->pidlFQ, 0, &sfi, sizeof(sfi),
                        SHGFI_PIDL | SHGFI_DISPLAYNAME | SHGFI_TYPENAME))
                    {
                        lvItem.pszText = sfi.szDisplayName;
                        int pos = InsertItem(&lvItem);
                        SetItemText(pos, 2, OnGetItemText(pos, 2, pItem));
                        dwFetched = 0;
                        continue;
                    }
                }
            }
となります。

 ここで追加部分を詳しく説明すると、「GetDriveType」でドライブの種類を取得し、「DRIVE_REMOVABLE」すなわちリムーバブルドライブの場合に、ディスプレイ名(3.5 インチ FD (A:))とタイプ名(3.5 インチ フロッピー ドライブ)だけをリストに追加するようにしてあります。

 結局、ドライブにアクセスしてあの音が出る処理は、41行目の
            pParentFolder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &dwAttr);
の属性を取得するところと、64行目の
                    SetItemText(iItem, iColumn, OnGetItemText(iItem, iColumn, pItem));
の「OnGetItemText」関数内のサイズ・更新日時を取得する処理なので、ここを処理させないようにすれば音は出ないという訳です。

 次回は、今回と同じようなクラス「CMFCShellTreeCtrl」での方法を紹介します。
ランキングへ     posted by 遠雷 | Comment(0) | コントロール
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。