Weder die Copy-Funktion des MSIE-Kontextmenüs noch die
ControlInterface->ExecWB()-Methode funktionieren mit der
TCppWebBrowser-Komponente. Mit Hilfe folgender Routine kann
die aktuelle Auswahl als Text oder als HTML-Code in die
Zwischenablage kopiert werden. Der Code funktioniert auch
auf den Seiten mit Frames.
#include <mshtml.h>
//---------------------------------------------------------------------------
// Funktion CopySelectionToClipboard() kopiert die aktuelle Auswahl im
// TCppWebBrowser in die Zwischenablage
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// TCppWebBrowser* pCppWebBrowser: Zeiger auf die TCppWebBrowser-Instanz
// bool blHtml : Format der Daten
// (true: HTML-Code, false: Plain Text)
//---------------------------------------------------------------------------
void CopySelectionToClipboard(TCppWebBrowser* pCppWebBrowser, bool blHtml)
{
IHTMLDocument2 *HTMLDocument = NULL;
LONG ilFramesCount = 0;
wchar_t* wcpSelectedText;
// Falls eine Seite geladen:
if(SUCCEEDED(pCppWebBrowser->Document->QueryInterface(
IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
// ggf. auch Frames-Code extrahieren:
IHTMLFramesCollection2 *pFrames = NULL;
if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
{
// Anzahl der Frames bestimmen:
pFrames->get_length(&ilFramesCount);
if(ilFramesCount == 0)
{
IHTMLSelectionObject* pSelection;
if(SUCCEEDED(HTMLDocument->get_selection(&pSelection)))
{
IHTMLTxtRange* pRange;
if(SUCCEEDED(pSelection->createRange((LPDISPATCH*)&(pRange))))
{
if(blHtml)
{
if(SUCCEEDED(pRange->get_htmlText(&wcpSelectedText)))
Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
}
else if(SUCCEEDED(pRange->get_text(&wcpSelectedText)))
Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
pRange->Release();
}
pSelection->Release();
}
}
else
{
VARIANT vFrame;
VARIANT ret;
vFrame.vt = VT_UINT;
// für jedes Frame:
for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
{
vFrame.lVal = ilFrameIndex;
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
{
// Zeiger auf IHTMLWindow2 des Frames besorgen:
IHTMLWindow2 *pWindow = NULL;
if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,
(LPVOID*)&pWindow)))
{
// Zeiger auf IHTMLDocument2 des Frames besorgen:
IHTMLDocument2 *pDoc = NULL;
if(SUCCEEDED(pWindow->get_document(&pDoc)))
{
IHTMLSelectionObject* pSelection;
if(SUCCEEDED(pDoc->get_selection(&pSelection)))
{
IHTMLTxtRange* pRange;
if(SUCCEEDED(pSelection->createRange((LPDISPATCH*)&(pRange))))
{
if(blHtml)
{
if(SUCCEEDED(pRange->get_htmlText(&wcpSelectedText)) &&
AnsiString(wcpSelectedText).Trim() != EmptyStr)
Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
}
else if(SUCCEEDED(pRange->get_text(&wcpSelectedText)) &&
AnsiString(wcpSelectedText).Trim() != EmptyStr)
Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
pRange->Release();
}
pSelection->Release();
}
pDoc->Release();
}
pWindow->Release();
}
}
}
}
pFrames->Release();
}
HTMLDocument->Release();
}
}
Auch der gesamte Inhalt einer Seite kann mit einem Mausklick in die
Zwischenablage befördert werden:
TVariant vIn, vOut;
// Alles markieren:
CppWebBrowser->ControlInterface->ExecWB(Shdocvw_tlb::OLECMDID_SELECTALL,
Shdocvw_tlb::OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
// Auswahl in die Zwischenablage kopieren:
CopySelectionToClipboard(CppWebBrowser, false);
// Auswahl aufheben:
CppWebBrowser->ControlInterface->ExecWB(Shdocvw_tlb::OLECMDID_CLEARSELECTION,
Shdocvw_tlb::OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);