「直前のファイル操作を元に戻すには?」について

[戻る]
佐野 2006/05/04(木) 12:05:44
この掲示板の

直前のファイル操作を元に戻すには?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200310/03100013.txt

を読み、自分のアプリケーションに実装してみましたが、どうもうまくいきません。

環境はXP SP2です。下はメニューを表示できるようにしたサンプルです。

同一プロセスからファイルを削除した後にメニューを見てみると、
確かに「元に戻す」の項目は存在します。しかし、選択しても反応がありません。
また、同一プロセスからコモンダイアログを呼び出し、
そこで「Ctrl+Z」を行うと元に戻すが作動します。
あと一歩という感じなのですが・・・。

void TestFunc(HWND hWnd)
{
    LPSHELLFOLDER        lpShellFolder;
    LPSHELLVIEW            lpShellView;
    LPCONTEXTMENU        lpContextMenu;
    CMINVOKECOMMANDINFO cmi;
    POINT po;
    HMENU M;
    int idCmd;

    //IShellFolder取得
    SHGetDesktopFolder(&lpShellFolder);

    //IShellView取得
    lpShellFolder->CreateViewObject(hWnd, IID_IShellView, (LPVOID *)
&lpShellView);

    //IContextMenu取得(ビュー背景のコンテキストメニュー)
    lpShellView->GetItemObject(SVGIO_BACKGROUND, IID_IContextMenu, 
(LPVOID *)&lpContextMenu);

    //メニューのリスト取得
    M = CreatePopupMenu();
    GetCursorPos(&po);
    lpContextMenu->QueryContextMenu(M, 0, 1, 0x7FFF, CMF_NORMAL);
    idCmd = TrackPopupMenu(M, TPM_LEFTALIGN | TPM_RETURNCMD | 
TPM_RIGHTBUTTON, 
        po.x, po.y, 0, hWnd, NULL);
    DestroyMenu(M);

    if ( idCmd != 0 )
    {
        ZeroMemory(&cmi, sizeof(CMINVOKECOMMANDINFO));
        cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
        cmi.fMask = 0;
        cmi.lpVerb = MAKEINTRESOURCEA(idCmd - 1);
        cmi.hwnd = hWnd;
        cmi.lpParameters = NULL;
        cmi.lpDirectory = NULL;
        cmi.nShow = SW_SHOWNORMAL;
        cmi.dwHotKey = 0;
        cmi.hIcon = NULL;
        lpContextMenu->InvokeCommand(&cmi);
    }

    //解放
    lpContextMenu->Release();
    lpShellFolder->Release();

    return;
}

試してないけど 2006/05/04(木) 13:26:00
idCmdには何が入ってきてるの?

佐野 2006/05/04(木) 13:48:26
2です。

本当はDelphiでの開発ですが、VC,Delphiともに2でした。

佐野 2006/05/08(月) 21:11:26
[[解決]]
解決とはいきませんが、

IShellViewのCreateViewWindow

を呼び出すと、動作することがわかりました。
というよりも、最終手段ですね。

古いスレッドには追加発言できません。