【问题标题】:how to open and control document?如何打开和控制文件?
【发布时间】:2015-01-08 10:44:53
【问题描述】:

我有一个充当显示器的 USB 平板电脑,我想在其中显示 Win32 窗口,这很容易通过使用 CreateWindow,但我还需要用户从此类窗口中选取列表中的文档并在其中显示它们完全相同的显示器。

我不能使用 CreateProcess,因为我不知道将打开文档的应用程序,如果我使用 ShellExecuteEx 打开 Word 文档,我可以获取进程的 PID,并在 EnumWindows 回调中迭代获取实际的窗口,但是我发现这很容易出错,当打开图像文档(jpg、png 等)时,结构 SHELLEXECUTEINFO 对 ShellExecuteEx 的调用中的 PID 为 NULL。此过程也容易失败,因为 Acrobat 或 Word 可以将多个文档保存在同一个 PID 下。那么各位大师是如何解决这个问题的呢? (在某个位置打开一个文档)

谢谢!

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

    SHELLEXECUTEINFO 结构有一个hMonitor 成员,可让您指定要使用的监视器,但应用程序是否尊重这一点取决于应用程序,因此您可能会发现它并不总是有效。要使用它,请设置SEE_MASK_HMONITOR 标志并从Multiple Display Monitor functions 之一获取监视器句柄。

    不幸的是,没有完全可靠的方法来识别打开特定文件的应用程序的“主窗口”。

    【讨论】:

    • Word 和 Acrobat 会观察文档最后关闭的位置,而不是该属性。
    • @user311174 确切地说,是否尊重它取决于应用程序。没有办法可靠地做到这一点,这就是我所说的。
    • 我没有说你错了,确实我赞成你的回答。当我有更多时间时,我想用 WebExplorer 探索一个解决方案,如果正确的话,我会在这里公开它,否则我会接受你的回答(问题是无论如何都要尝试控制文档)
    【解决方案2】:

    虽然 Jonathan Potter 说的都是对的,但似乎这可以用 COM 完成,Stackoverflow 中没有太多文献可以提供链接,所以我宁愿放一个我在互联网上找到的最小示例来控制大小和IE的位置。

    #include <windows.h>
    #include "Mshtml.h"
    
    void testme(void * ptr )
    {
        RECT * rect = (RECT *)ptr;
        CLSID clsid;
        LPUNKNOWN punk = NULL;
        IWebBrowser2 *pWB = NULL;
        IHTMLDocument2 *pHTML = NULL;
        IHTMLElementCollection *pElement = NULL;
        IDispatch *pdisp = NULL;
        DISPID  dispidNamed = DISPID_PROPERTYPUT;
        VARIANT_BOOL bBusy;
        VARIANT var;
    
        OleInitialize(NULL);
        CLSIDFromProgID(OLESTR("InternetExplorer.Application"), &clsid);
        CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IUnknown, (LPVOID *)&punk);
        punk->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pWB);
        pWB->put_Visible(TRUE);
        pWB->put_Height(300);
        pWB->put_Top(rect->top);
        pWB->put_Left(rect->left);
        pWB->put_Width(rect->right - rect->left);
        pWB->put_Height(rect->bottom - rect->top);  
    
    
        BSTR bstrVal = SysAllocString(L"http://localhost:8080"); //Set web page on  IE
        var.vt = VT_I4;
        var.lVal = 0;   
        pWB->Stop();
        pWB->Navigate(bstrVal, &var, &var, &var, &var);
        SysFreeString(bstrVal); 
        struct info info;
    
        long IE_HWND = 0;
        if (pWB->get_HWND(&IE_HWND) != S_OK) 
        {
            AfxMessageBox("Failed: pWB->get_HWND");
            return;
        }
    
        pWB->Release();
        punk->Release();
        OleUninitialize();
    }
    

    现在,如果您希望 IE 显示文档而不是下载,请在响应中添加如下内容: “内容处置”、“内联;_file_name_.pdf”

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2017-05-11
      • 2017-08-06
      • 2012-06-10
      相关资源
      最近更新 更多