首页 > 解决方案 > 在关闭打开它的应用程序时如何保持属性对话框打开?

问题描述

我正在做一些可以拉出上下文菜单的东西。我希望能够关闭应用程序,同时保留“属性”等打开的内容。发生的情况是,如果您打开上下文菜单,选择“属性”,它会打开属性对话框并很好地关闭上下文菜单。但是当我关闭我的应用程序时,属性窗口也会关闭。

问题是:你如何保持那个窗口打开?如果你不能,应用程序如何判断它是否有一个依赖于它打开的窗口/对话框?EnumWindows 不显示它;Spy++ 显示属性对话框也独立存在(在桌面下)。

CComPtr<IContextMenu> pMenu;
CComPtr<IShellFolder> pFolder;
PCUITEMID_CHILD pidl = NULL;
SHBindToParent(item.pidl, IID_IShellFolder, (void**)&pFolder, &pidl);
pFolder->GetUIObjectOf(NULL, 1, &pidl, IID_IContextMenu, NULL, (void**)&pMenu);
UINT flags = CMF_NORMAL | CMF_CANRENAME;
pMenu->QueryContextMenu(menu, CID_FIRST, CID_LAST, 0x7fff, flags);
.
.
.
// command invocation
CMINVOKECOMMANDINFOEX info;
memset(&info, 0, sizeof(info));
info.cbSize = sizeof(info);
info.fMask = CMIC_MASK_NOASYNC | CMIC_MASK_PTINVOKE; // I've played around with flags
info.hwnd = toolbar.m_hWnd; // I've played around with this value
info.lpVerb = MAKEINTRESOURCEA(cid - CID_LAST);
info.nShow = SW_SHOWNORMAL;
info.ptInvoke = point;
pMenu->InvokeCommand((CMINVOKECOMMANDINFO*)&info);  

蒂亚!!

标签: shellwinapicom

解决方案


属性对话框正在进行中。

您需要调用SHSetInstanceExplorer保持您的进程处于活动状态,直到该 COM 对象被释放

int main()
{
    struct CoInit { HRESULT m_hr; CoInit() { m_hr = CoInitialize(0); } ~CoInit() { if (SUCCEEDED(m_hr)) CoUninitialize(); } } coinit;
    ProcessReference ref;
    IShellItem*pSI;
    HRESULT hr = SHCreateItemInKnownFolder(FOLDERID_Windows, KF_FLAG_DEFAULT, L"Explorer.exe", IID_IShellItem, (void**) &pSI);
    if (hr) return hr;
    IContextMenu*pCM;
    hr = pSI->BindToHandler(NULL, BHID_SFUIObject, IID_IContextMenu, (void**) &pCM);
    pSI->Release();
    if (hr) return hr;
    //HMENU menu = CreatePopupMenu();
    //pCM->QueryContextMenu(menu, 0, 1, 0x7fff, CMF_NORMAL);
    CMINVOKECOMMANDINFO info;
    memset(&info, 0, sizeof(info));
    info.cbSize = sizeof(info);
    info.fMask = CMIC_MASK_NOASYNC; // I've played around with flags
    info.hwnd = NULL; // I've played around with this value
    info.lpVerb = "Properties";
    info.nShow = SW_SHOWNORMAL;
    //info.ptInvoke = point;
    hr = pCM->InvokeCommand((CMINVOKECOMMANDINFO*)&info);
    pCM->Release();
    return hr;
}

推荐阅读