この掲示板の
直前のファイル操作を元に戻すには?
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;
}
idCmdには何が入ってきてるの?
2です。
本当はDelphiでの開発ですが、VC,Delphiともに2でした。
解決とはいきませんが、
IShellViewのCreateViewWindow
を呼び出すと、動作することがわかりました。
というよりも、最終手段ですね。