4

このクラスを使用して、WebBrowserドキュメントを開き、値を変更し、保存して印刷します。問題は、ヘッダー(「ページ1/1」)とフッター(ドキュメントのルート+日付)を含むドキュメントを印刷することです。

ドキュメントを調べましたが、それらを削除する方法が見つかりませんでした。使用することも可能WebBrowserですか、それとも代替手段を探す必要がありますか?

4

3 に答える 3

3

解決策がありますが、おそらくそれがあったほどきれいではありません。WebBrowserはInternetExplorerからの設定を継承しているため、レジストリの値を変更することができます。幸い、値はHKCUの下にあるため、管理権限は必要ありません。

https://stackoverflow.com/a/1321314/1630928をご覧ください

于 2013-03-25T10:30:57.743 に答える
1

これを行う秘訣は、バリアントのByRefSafeArrayを含むバリアントをWebBrowserコントロールに渡すことです。私はC#からそれを行う方法を理解していません。これは、マネージC++を使用することに頼った同じ問題に取り組んでいた他の誰かです

http://www.limilabs.com/blog/printing-in-webbrowser-control-custom-header-and-footer

于 2013-03-25T11:29:56.800 に答える
0

C#ではありませんが、現在は機能していないKB267240に基づいて作成したC++コードを次に示します。印刷中にヘッダーとフッターが削除されます。

BOOL bRes = FALSE;

//Get IWebBrowser2 from your IE control
CComPtr<IWebBrowser2> pWebBrowser = this->GetIWebBrowser2();
if(pWebBrowser)
{
    HRESULT hr;
    COleVariant varNull;

    SAFEARRAYBOUND psabBounds[1];
    SAFEARRAY *psaHeadFoot;
    hr = S_OK;

    VARIANT vArg;
    BOOL bGot_vArg = FALSE;

    VARIANT vHeadStr, vFootStr;
    long rgIndices;
    VariantInit(&vHeadStr);
    VariantInit(&vFootStr);

    // Initialize header and footer parameters to send to ExecWB().
    psabBounds[0].lLbound = 0;
    psabBounds[0].cElements = 3;
    psaHeadFoot = SafeArrayCreate(VT_VARIANT, 1, psabBounds);
    if(psaHeadFoot)
    {
        // Argument 1: Header
        vHeadStr.vt = VT_BSTR;
        vHeadStr.bstrVal = SysAllocString(L" ");    //Must be at least one space
        if (vHeadStr.bstrVal)
        {
            // Argument 2: Footer
            vFootStr.vt = VT_BSTR;
            vFootStr.bstrVal = SysAllocString(L" ");    //Must be at least one space
            if(vFootStr.bstrVal)
            {
                rgIndices = 0;
                SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vHeadStr));
                rgIndices = 1;
                SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vFootStr));
                rgIndices = 2;
                SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&varNull));    //Set stream to NULL as we don't need it

                //NOTE: Currently, the SAFEARRAY variant must be passed by using
                // the VT_BYREF vartype when you call the ExecWeb method.
                VariantInit(&vArg);
                vArg.vt = VT_ARRAY | VT_BYREF;
                vArg.parray = psaHeadFoot;

                //Got it
                bGot_vArg = TRUE;
            }
        }
    }


    //Did we get all the vars?
    if(bGot_vArg)
    {
        if(SUCCEEDED(hr = pWebBrowser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, &vArg, NULL)))
        {
            //All good
            bRes = TRUE;
        }
    }
    else
    {
        //Use fallback (that will keep the footer & header)
        if(SUCCEEDED(hr = pWebBrowser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, varNull, varNull)))
        {
            //Printed via fallback
            bRes = TRUE;
        }
    }

    //Clean up
    VariantClear(&vHeadStr);
    VariantClear(&vFootStr);
    if(psaHeadFoot)
    {
        SafeArrayDestroy(psaHeadFoot);
        psaHeadFoot = NULL;
    }
}
于 2019-03-07T08:38:47.203 に答える