如何在对话框中托管预览处理程序

2024-04-23

我正在尝试在对话框中托管文件预览处理程序。我已经为资源管理器中的选择更改设置了一个事件接收器。当选择更改时,我将选定的 shell 项目提供给对话框,该对话框又将其提供给准备预览帧的函数。

一般来说,它会成功加载正确的处理程序并显示文件的内容,但对于某些文件类型(即 Excel 和 Word 文件),它会遇到各种问题,例如焦点丢失或闪烁。下面是 Excel 预览处理程序弄乱焦点的演示(我所说的弄乱是指它错误地从资源管理器中窃取了焦点,而我希望保持焦点):

Word 文件可能会成功加载一次,但随后会失败,尤其是在打开 Word 时。

至于代码:

对于初学者来说,这是我从文件扩展名获取预览处理程序的函数。这似乎工作正常:

HRESULT PreviewHandlerFromExt(LPCWSTR pszExt, IPreviewHandler** ppph)
{
    WCHAR szCLSID[CLSID_LEN] = { 0 };
    DWORD cchOut = CLSID_LEN;
    HRESULT hr = AssocQueryString(  ASSOCF_INIT_DEFAULTTOSTAR,
                                    ASSOCSTR_SHELLEXTENSION,
                                    pszExt,
                                    L"{8895b1c6-b41f-4c1c-a562-0d564250836f}",
                                    szCLSID,
                                    &cchOut );
    if (FAILED(hr))
    {
        return hr;
    }

    CLSID clsid;
    hr = CLSIDFromString(szCLSID, &clsid);
    if (FAILED(hr))
    {
        return hr;
    }

    CComPtr<IUnknown> punk;
    hr = punk.CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER);
    if (FAILED(hr))
    {
        return hr;
    }

    CComPtr<IPreviewHandler> pPrevHandler;
    hr = punk->QueryInterface(&pPrevHandler);
    if (FAILED(hr) || !pPrevHandler)
    {
        return hr;
    }

    return pPrevHandler.CopyTo(ppph);
}

现在,这是我的对话框中准备预览的函数,给定一个 shell 项 (m_pPreviewHandler是活动预览处理程序,IDC_PREVIEWFRAME是预览窗格对话框中的占位符,并且m_mapExtsToPreviewHandlers只是一个用于在用户遇到预览处理程序时存储预览处理程序的映射):

void CMyDialog::ShowPreview(IShellItem* pShItem)
{
    HRESULT hr;

    if (m_pPreviewHandler)
    {
        m_pPreviewHandler->Unload();
        m_pPreviewHandler.Release();
    }

    CComHeapPtr<WCHAR> pszPath;
    hr = pShItem->GetDisplayName(SIGDN_FILESYSPATH, &pszPath);
    if (FAILED(hr))
    {
        return;
    }

    LPWSTR pszExt = CharLower(PathFindExtension(pszPath));

    auto it = m_mapExtsToPreviewHandlers.find(pszExt);
    if (it == m_mapExtsToPreviewHandlers.end())
    {
        hr = PreviewHandlerFromExt(pszExt, &m_pPreviewHandler);
        if (FAILED(hr) || !m_pPreviewHandler)
        {
            return;
        }

        m_mapExtsToPreviewHandlers[pszExt] = m_pPreviewHandler;
    }

    else
    {
        m_pPreviewHandler = m_mapExtsToPreviewHandlers[pszExt];
    }

    CComPtr<IInitializeWithFile> pInitWithFile;
    hr = m_pPreviewHandler->QueryInterface(&pInitWithFile);
    if (SUCCEEDED(hr))
    {
        hr = pInitWithFile->Initialize(pszPath, STGM_READ);
        if (FAILED(hr))
        {
            return;
        }
    }

    else
    {
        CComPtr<IInitializeWithStream> pInitWithStream;
        hr = m_pPreviewHandler->QueryInterface(&pInitWithStream);
        if (SUCCEEDED(hr))
        {
            CComPtr<IStream> pStream;
            hr = SHCreateStreamOnFile(pszPath, STGM_READ, &pStream);
            if (FAILED(hr) || !pStream)
            {
                return;
            }

            hr = pInitWithStream->Initialize(pStream, STGM_READ);
            if (FAILED(hr))
            {
                return;
            }
        }
    }

    CWindow wndPreviewFrame( GetDlgItem(IDC_PREVIEWFRAME) );
    CRect rectPreviewFrame;
    wndPreviewFrame.GetClientRect(&rectPreviewFrame);

    hr = m_pPreviewHandler->SetWindow(wndPreviewFrame, &rectPreviewFrame);
    if (FAILED(hr))
    {
        return;
    }

    hr = m_pPreviewHandler->DoPreview();
    if (FAILED(hr))
    {
        return;
    }

    hr = m_pPreviewHandler->SetRect(&rectPreviewFrame);
    if (FAILED(hr))
    {
        return;
    }
}

有谁知道我做错了什么或者什么可以解决这些焦点问题?

我也尝试过放置LockSetForegroundWindow各个地方都有,但是没有锁。

另外,对话框资源如下所示:


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在对话框中托管预览处理程序 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 按成员序列化

    我已经实现了template
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将 MS 转换为秒

    我发现这个公式可以用来将 MS 转换为秒 但它是为 Excel 2002 编写的 而我正在使用 2010 CONCATENATE TEXT INT B1 1000 86400 hh mm ss B1 INT B1 1000 1000 以下是
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • C# 泛型限制传播

    这个例子是实际问题的简化 但是我怎样才能编译它呢 我希望泛型约束能够传播 既然 T 是一个 TClass 并且 TClass 是一个类 为什么 T 不是一个类呢 public class MyClass
  • 变量是大小为 1 的数组吗?

    考虑一下 int main int char int variable 21 int array 1 21 using ArrayOf1Int int 1 reinterpret cast
  • 无法在 MacOS Big Sur 上安装/运行 Python 3.6.x 和 3.7.x [已关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我将 mac 操作系统升级到最新的 MacOS Big Sur 更新后我以前使用 python 3 6 x 3 7 x
  • “Alternative”中的模式匹配

    我有一个函数 它的参数进行模式匹配以生成计算StateT Maybe 可以这么说 此计算在运行时可能会失败 在这种情况下 我希望当前的模式匹配分支失败 我非常怀疑是否有可能有类似的东西 compute Int gt StateT Maybe
  • C# WebClient 使用异步并返回数据

    好吧 我在使用 DownloadDataAsync 并让它返回字节给我时遇到了问题 这是我正在使用的代码 private void button1 Click object sender EventArgs e byte bytes usi
  • HTTPS 上的 SWFUpload 无法正常工作

    当目标 servlet 侦听 HTTPS 时 我在使用 SWFUpload 上传文件时遇到问题 在 HTTP 上它工作得很好 仅当使用 FireFox 或 Opera 时才会出现此问题 在 IE 上它工作正常 没有尝试过其他浏览器 EDIT
  • 如何发出 JMS 同步请求

    我有一个 Web 应用程序 预计将从外部应用程序获取和显示数据 该外部应用程序只能通过消息传递 JMS 访问 因此 如果用户在浏览器上提交请求 则同一 HTTP 请求线程将必须与消息系统 MQ 系列 交互 以便同一请求线程可以显示从消息系统
  • 如何在 Silverlight/C# 中访问 ListBox 控件的 ScrollViewer 元素?

    我希望从 C 动态更改 Silverlight ListBox 的滚动位置 并且我需要知道如何从 C 访问 ListBox 控件的 ScrollViewer 元素 多谢你们 杰夫 在从 ListBox 类继承的类中 您可以使用 Protec
  • 区分大小写的文件系统上的 File.equals

    我有一个字符串形式的文件路径 在 Java 中 我需要确定文件系统上是否存在该文件 并且我们的代码需要跨平台 因为它在 Windows Linux 和 OS X 上运行 问题是文件路径和文件本身的大小写可能不匹配 即使它们确实代表相同的文件
  • 如何重叠两个控件

    我有一个圆和一个线控件 Circle 控件的 OnPaint 绘制一个圆 Line 控件的 OnPaint 绘制一条线 这两个控件包含在另一个控件 DrawingControl 中 我需要在圆上放置一条线 但圆的背景删除了该线 我尝试启用透
  • 如何在C#中将JSON数据保存到SQL Server数据库?

    我正在使用 synapse pay API 作为回报 我得到了一些响应 我想将该响应保存在 SQL 数据库中 我为此创建了课程 下面是获取响应的代码 var httpWebRequest HttpWebRequest WebRequest
  • 为什么我的 Android HttpClient 在调用 Execute 时不发送参数?

    我有一个AsyncTask设置创建一个AndroidHttpClient并打电话Execute 有一个HttpPost and BasicHttpContext我提供的对象 我设置了HttpPost像这样 HttpPost myPost n
  • 加载 aspnetcore RC2 默认网站项目时出现“Bad Gateway”错误

    我尝试通过 IIS 运行默认的 ASP NET Core Web 应用程序 VS 2015 中的 Web 应用程序模板 我已按照文档的说明进行操作here https docs asp net en latest publishing ii
  • 从 Android Studio 运行 Android 应用程序时如何启用协程调试模式?

    我在通过 Android Studio 以调试模式运行 Android 应用程序时遇到协程异常 kotlinx coroutines JobCancellationException StandaloneCoroutine 已取消 来自协程
  • 错误:“;”之前应有构造函数、析构函数或类型转换令牌?

    我正在尝试编译代码来测试读取和打印数据文件的函数 但出现我不明白的编译错误 错误 预期的构造函数 析构函数或 之前的类型转换 令牌 相关代码文本墙如下 struct Day int DayNum int TempMax int TempMi
  • 将此 c-cast 更改为reinterpret_cast 是否安全?

    我正在尝试从我正在处理的某些代码中删除 c 风格的强制转换 并且我对唯一的替代方案感到担忧 原来的代码是 WPARAM param WPARAM GetDlgItem IDC WORKFLOW m hWnd this gt PostMess
  • 如何使用 jQuery(schema.org 微格式)查找和读取元数据?

    我正在构建一个 Google 地图应用程序 我想读出元数据 如指定的那样schema org http schema org LocalBusiness 从我的 HTML 绘制我的地图标记 例如 li some html div class
  • 在真实的 Android 设备上运行 React Native 应用程序时无法与服务器连接

    我试图在我真正的 Android 设备上运行我的 React Native 应用程序 因为在使用 Android studio 时笔记本电脑变得太热 8 Gb RAM 痛苦 因此 我启用了 USB 调试 插入电缆并运行命令 react na
  • 远程nodejs服务器部署永远

    我正在尝试通过提交后钩子在远程计算机上部署节点js服务器 该钩子将调用远程计算机上执行实际部署的脚本 我面临的问题是 如果我在计算机上运行远程脚本 它可以正常工作 但是当我尝试通过 ssh 命令执行相同的脚本时 服务器无法启动 这就是我的提
  • 如何在对话框中托管预览处理程序

    我正在尝试在对话框中托管文件预览处理程序 我已经为资源管理器中的选择更改设置了一个事件接收器 当选择更改时 我将选定的 shell 项目提供给对话框 该对话框又将其提供给准备预览帧的函数 一般来说 它会成功加载正确的处理程序并显示文件的内容