据我了解,目前有两种方法可以使用资源管理器从 Shell 命名空间扩展复制虚拟文件,以便向用户显示复制 GUI:
通过IDataObject接口:
读取文件是通过至少IDataObject::GetData支持CFSTR_FILEDESCRIPTORW,CFSTR_FILECONTENTS和剪贴板格式来完成的。CFSTR_SHELLIDLIST请求应创建一个用于访问数据的对象CFSTR_FILECONTENTS。当需要时,通过设置标志来启用 UI 。IDataObject::GetDataIStreamFD_PROGRESSUICFSTR_FILEDESCRIPTORW
通过ITransferSource接口:
读取文件是通过ITransferSource::OpenItem请求IShellItemResources. 然后IShellItemResources应将{4F74D1CF-680C-4EA3-8020-4BDA6792DA3C}资源报告为受支持(GUID 指示该项目有一个 IStream)。最后,IStream通过父级请求ShellFolder::BindToObject访问数据。UI 由资源管理器本身处理,它始终显示。
我的问题是:这两种机制单独工作得很好(正如您从屏幕截图中看到的)。但是一旦我启用了IDataObjectfromIShellFolder::GetUIObjectOf和ITransferSourcefrom IShellFolder::CreateViewObject- 总是使用 via 方法IDataObject,导致旧的副本 GUI(如第一个屏幕截图所示)。我从跟踪日志中看到ITransferSource多次请求,但没有执行任何操作,它只是立即释放并销毁。
那么,当从 Shell 命名空间扩展进行复制时,如何强制资源管理器显示精美的复制 GUI?
可以在这里找到最小的可重现示例:https://github.com/BilyakA/SO_73938149
在研究最小可重复示例时,我设法使其在启用IDataObject和ITranfserSource接口的情况下按预期工作。事情发生在之后:
regsvr32 /u …winapi windows-shell shell-extensions shell-namespace-extension
我现在正在使用游乐场SDK,需要获得我游戏窗口的WNDCLASS.我还没有在SDK中找到任何东西,这就是为什么我试图用hWnd的游戏窗口来做这件事.那么有没有办法从HWND获得WNDCLASS?我需要这个来改变游戏窗口中的系统光标
我有一个QML ProviderItem,它具有objects属性,该属性返回QObject派生的对象的列表。
我想将此列表作为其功能ConsumerAll的属性传递给另一个QML ConsumerItem。问题是我总是将所有回调函数设置为0并将数据指针设置为0的情况下始终得到空的QQmlListProperty(我认为这些是默认构造的值)
像这样:
ProviderItem.h
class ProviderItem : public QObject, public QQmlParserStatus
{
Q_OBJECT
public:
Q_PROPERTY(QQmlListProperty<QObject> objects READ objects NOTIFY objectsChanged)
QQmlListProperty<QObject> objects();
static int objects_count(QQmlListProperty<QObject> *);
static QObject* objects_at(QQmlListProperty<QObject> *, int);
private:
QList<QObject*> m_objects;
}
Run Code Online (Sandbox Code Playgroud)
ProviderItem.cpp
QQmlListProperty<QObject> ProviderItemPrivate::objects()
{
return QQmlListProperty<QObject>(this, nullptr,
ProviderItem::objects_count,
ProviderItem::objects_at);
}
QObject* ProviderItem::objects_at(QQmlListProperty<QObject> *prop, int index)
{
ProviderItem* provider = qobject_cast<ProviderItem*>(prop->object)
return provider->m_objects.at(index);
}
int ProviderItem::objects_count(QQmlListProperty<QObject> *prop)
{
ProviderItem* provider = qobject_cast<ProviderItem*>(prop->object)
return provider->m_objects.count();
}
Run Code Online (Sandbox Code Playgroud)
ConsumerItem.h
class ConsumerItem: public QObject
{
Q_OBJECT
public:
Q_INVOKABLE …Run Code Online (Sandbox Code Playgroud)