小编ElD*_*ado的帖子

如何强制资源管理器使用带有 Shell 命名空间扩展的现代文件操作对话框

据我了解,目前有两种方法可以使用资源管理器从 Shell 命名空间扩展复制虚拟文件,以便向用户显示复制 GUI:

  1. 通过IDataObject接口:

    读取文件是通过至少IDataObject::GetData支持CFSTR_FILEDESCRIPTORW,CFSTR_FILECONTENTS和剪贴板格式来完成的。CFSTR_SHELLIDLIST请求应创建一个用于访问数据的对象CFSTR_FILECONTENTS。当需要时,通过设置标志来启用 UI 。IDataObject::GetDataIStreamFD_PROGRESSUICFSTR_FILEDESCRIPTORW

    IDataObject 复制 UI

  2. 通过ITransferSource接口:

    读取文件是通过ITransferSource::OpenItem请求IShellItemResources. 然后IShellItemResources应将{4F74D1CF-680C-4EA3-8020-4BDA6792DA3C}资源报告为受支持(GUID 指示该项目有一个 IStream)。最后,IStream通过父级请求ShellFolder::BindToObject访问数据。UI 由资源管理器本身处理,它始终显示。

    ITransferSource 复制 UI

我的问题是:这两种机制单独工作得很好(正如您从屏幕截图中看到的)。但是一旦我启用了IDataObjectfromIShellFolder::GetUIObjectOfITransferSourcefrom IShellFolder::CreateViewObject- 总是使用 via 方法IDataObject,导致旧的副本 GUI(如第一个屏幕截图所示)。我从跟踪日志中看到ITransferSource多次请求,但没有执行任何操作,它只是立即释放并销毁。

那么,当从 Shell 命名空间扩展进行复制时,如何强制资源管理器显示精美的复制 GUI?


可以在这里找到最小的可重现示例:https://github.com/BilyakA/SO_73938149


在研究最小可重复示例时,我设法使其在启用IDataObjectITranfserSource接口的情况下按预期工作。事情发生在之后:

  1. 未注册的 x64 构建 SNE 示例 ( regsvr32 /u …

winapi windows-shell shell-extensions shell-namespace-extension

5
推荐指数
1
解决办法
441
查看次数

如何从HWND获得WNDCLASS?

我现在正在使用游乐场SDK,需要获得我游戏窗口的WNDCLASS.我还没有在SDK中找到任何东西,这就是为什么我试图用hWnd的游戏窗口来做这件事.那么有没有办法从HWND获得WNDCLASS?我需要这个来改变游戏窗口中的系统光标

c++ hwnd

3
推荐指数
1
解决办法
2860
查看次数

将Qml的QQmlListProperty传递给C ++作为参数

我有一个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)

c++ qt qml

3
推荐指数
1
解决办法
134
查看次数