参考 获取运行中的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());
}
扫描二维码关注公众号,回复:
12675672 查看本文章
![](/qrcode.jpg)