shell - 在关闭打开它的应用程序时如何保持属性对话框打开?
问题描述
我正在做一些可以拉出上下文菜单的东西。我希望能够关闭应用程序,同时保留“属性”等打开的内容。发生的情况是,如果您打开上下文菜单,选择“属性”,它会打开属性对话框并很好地关闭上下文菜单。但是当我关闭我的应用程序时,属性窗口也会关闭。
问题是:你如何保持那个窗口打开?如果你不能,应用程序如何判断它是否有一个依赖于它打开的窗口/对话框?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);
蒂亚!!
解决方案
属性对话框正在进行中。
您需要调用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;
}
推荐阅读
- html - 使用 flexbox 和 bootstrap 卡填充高度
- qt - Qt Installer 创建开始菜单快捷方式
- firebase - 用户注册时 Firestore 权限不一致
- c# - MySQL 服务器停止运行从 C# 应用程序发送的特定查询
- amazon-web-services - Athena 查询排队时间:什么影响它?
- mysql - 如何将变量值设置为零每一行
- c# - 在 linq 查询中返回集合时,用字符串数组替换整数数组
- javascript - 获取 React 中被点击元素的值
- node.js - 从主机在 docker 容器上运行命令
- tensorflow - 如何在 tensorlfow/keras 中创建 RoI 池化层?