获取运行中的Word,excel对象

参考 获取运行中的Word对象:https://blog.csdn.net/seker_2006/article/details/1335702

PPT在CreateDispatch _T("Word.Application")可以直接使用获取当前文档,word和excel不能获取当前激活文档,需要采用以下两种方式。

 

1.使用AccessibleObjectFromWindow function

这里说明word的主窗口是OpusApp,_WwG是文本窗口,

#include "oleacc.h"
#pragma comment(lib,"Oleacc.lib")
HWND _hwndWwG=NULL;
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
{

	TCHAR _className[MAX_PATH]={NULL};

	GetClassNameW(hwndChild ,_className, MAX_PATH);
	TRACE("\t\n");
	TRACE(_className);
	//AfxMessageBox(_className);
	if(_tcscmp((TCHAR *)lParam,_className)==0) 
	{
		TRACE(_className);
		AfxMessageBox(_className);
		_hwndWwG=hwndChild;
	}
	return true;
}


void CwordDlg::OnBnClickedButton1()
{
 	CApplication m_wdApp;
	CComPtr<IDispatch> spDisp;//获取Word的Window对象的智能指针
	CWindows m_Win;//定义Word的Windows对象  
	HWND hwndWord=::FindWindowW(_T("OpusApp"),NULL);
	EnumChildWindows(hwndWord, EnumChildProc, (LPARAM) _T("_WwG"));
	while(_hwndWwG==NULL)
	{
		EnumChildWindows(hwndWord, EnumChildProc,(LPARAM) _T("_WwG"));
		hwndWord = ::GetNextWindow(hwndWord, GW_HWNDNEXT);
		if(hwndWord==NULL)
		{
			AfxMessageBox(_T("没有找到打开的wps!"));
			return;
		}
	}

	HRESULT _result;
	 _result = AccessibleObjectFromWindow( _hwndWwG, OBJID_NATIVEOM, IID_IDispatch, (void**) &spDisp);
	 if(_result != S_OK)
	 {
		 AfxMessageBox(_T("AccessibleObjectFromWindow FALSE"));
		 return;
	 }
	 //hwnd就是需要获取的窗口句柄 
		m_Win.AttachDispatch(spDisp);//成功了 
		m_wdApp.AttachDispatch(m_Win.get_Application());//m_App是Word的应用程序对象
	 
	
	//CWindow0 _window0= m_wdApp.get_ActiveWindow();
	CDocument0 _docment0=m_wdApp.get_ActiveDocument();
	CShapes _shapes=_docment0.get_Shapes();

	CnlineShapes m_wdInlineShapes;
	CnlineShape m_wdInlineShape;
	m_wdInlineShapes=_docment0.get_InlineShapes();
 
	COleVariant vTrue((short)TRUE),    
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	//需要指定位置
	_shapes.AddPicture(_T("C:\\1.png"),vFalse,vTrue,COleVariant((long)1),COleVariant((long)1),COleVariant((long)100),COleVariant((long)100),vOptional);
	//自动在光标开始处插入
 //InlineShapes.AddPicture(_T("c:\\1.png"),vFalse,vTrue,vOptional);
	m_wdApp.DetachDispatch( );
	m_Win.DetachDispatch( );

	if(m_wdInlineShape)
		m_wdInlineShape.ReleaseDispatch();
	if(_shapes)
		_shapes.ReleaseDispatch();
	if(_docment0)
		_docment0.ReleaseDispatch();

	if(m_wdApp)
		m_wdApp.ReleaseDispatch();

	if(m_Win)
		m_Win.ReleaseDispatch();



}

2.第二种方法

 

void CwordDlg::OnBnClickedButton2()
{
	CString strResult;
	// TODO: Add your dispatch handler code here
	CLSID clsid;
	HRESULT hr;//here  is result 32bit long
	hr=::CLSIDFromProgID(L"Word.Application",&clsid);//通过progId取得clsId

	if(FAILED(hr))
	{
		return  ;//如果没有安装word,则返回null
	}

	IUnknown *pUnknown=NULL;//com接口
	IDispatch *pDispatch=NULL;
	CApplication app=NULL;
	CSelection sel=NULL;
	hr=::GetActiveObject(clsid,NULL,&pUnknown);//查找是否有word程序运行

	if(FAILED(hr))
	{
		return  ;//如果没有运行word返回null
	}
	try
	{
		//获得运行word对象调用IUnknown接口的queryinterface方法,返回word对象
		hr=pUnknown->QueryInterface(IID_IDispatch,(LPVOID*)&app);

		if(FAILED(hr))
			throw (_T("没有取得iddispatchptr"));
		//释放IUnknown接口对象 
		pUnknown->Release();
		pUnknown=NULL;
		//通过app获得选区
		sel=app.get_Selection();

		if(!sel)
			throw (_T("没有正在编辑的文档"));

	

		COleVariant vTrue((short)TRUE),    
			vFalse((short)FALSE),
			vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
		CnlineShapes m_wdInlineShapes;
		CnlineShape m_wdInlineShape;
		m_wdInlineShapes=sel.get_InlineShapes();
		m_wdInlineShape=m_wdInlineShapes.AddPicture(_T("c:\\1.png"),vFalse,vTrue,vOptional);

		//sel.WholeStory();//全部选择
		strResult=sel.get_Text();//取得文本
	}catch(LPCTSTR lpErr)
	{
		CString s=lpErr;
	 	AfxMessageBox(s.AllocSysString()) ;
	}

	 
	//释放资源
	if(pUnknown)
		pUnknown->Release();
	if(sel)
		sel.ReleaseDispatch();
	if(app)
		app.ReleaseDispatch();
	 
	//返回取得的文档内容
 AfxMessageBox(strResult.AllocSysString());
}

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值