用IDataObject訪問剪切板

一個簡單的通過OLE來訪問粘貼板的例子: 
WINOLEAPI OleGetClipboard(IDataObject ** ppDataObj); 

這個簡單的Windows API調用用來返回一個IDataObject,它提供用來一個乾淨地訪問WINDOWS粘貼板內容的好接口。注意,我們在本例中不需要實現IDataObject 接口,我們僅僅需要知道接口怎麼樣工作的,一個簡單的訪問粘貼板內容的程序如下: 

#include <Windows.h>
#include <ObjBase.h>
#include <iostream>
using namespace std;

void DisplayDataObject(IDataObject *pDataObject)
{
	FORMATETC fmtetc = {CF_TEXT,0,DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
	STGMEDIUM stgmedium;
	if(pDataObject->GetData(&fmtetc,&stgmedium) == S_OK)
	{
		char* data = (char*)GlobalLock(stgmedium.hGlobal);
		cout<<data<<endl;
		GlobalUnlock(stgmedium.hGlobal);
		ReleaseStgMedium(&stgmedium);
	}
}

int main()
{
	if(OleInitialize(0)!= S_OK)
		return 0;
	IDataObject *pDataObject;
	if(OleGetClipboard(&pDataObject) == S_OK)
	{
		DisplayDataObject(pDataObject);
		pDataObject->Release();
	}
	OleUninitialize();
	return 0;
}
上面的代碼演示了最常用的訪問IDataObject 的方法,數據通過調用IDataObject::GetData來請求,構造一個FORMATETC對象,它指定了想要訪問的數據的類型,在這個例子中,標準的CF_TEXT數據緩衝區以HGLOBAL內存對象來存儲。 數據返回到提供的STGMEDIUM結構體中,一旦我們鎖定並顯示數據,清理和調用標準的 ReleaseStgMedium  API來釋放存儲在STGMEDIUM結構中的數據。 

注意,代碼中僅僅當文本被選擇到粘貼板的時候才工作,也就是說,如果沒有CF_TEXT被存儲到粘貼板,粘貼板的IDataObject::GetData程序調用會失敗.什麼也不打印。 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章