1. pro : 增加 QT+=axcontainer
2.打开ppt
QAxObject *ppt_dsoframer;
ppt_dsoframer=new QAxObject(this);
bool ppt_state=ppt_dsoframer->setControl("Powerpoint.Application");
if(!ppt_state)//连接控件
QMessageBox::critical(this, "Error", "no office ppt!");
QString filePath = QFileDialog::getOpenFileName(0, "Open ppt", QString(), "*.pptx *ppt;; ");
if (filePath.isEmpty())
return;
ppt_dsoframer->dynamicCall("SetVisible(bool)",true); //设置窗口显示
ppt_dsoframer->querySubObject("Presentations()")->dynamicCall("Open(string)",filePath); //选择打开ppt的路径
//放映这个剪辑
ppt_dsoframer->querySubObject("ActivePresentation")->querySubObject("SlideShowSettings")->dynamicCall("Run()");
3.嵌入QWidget
//嵌入QWidget
int index = filePath.lastIndexOf("/");
QString filename =filePath.mid(index+1,filePath.length());
QList<HWND> hwndList = GetWindowHandleListByPID(filename);//根据PPT名字获取进程ID号
QWindow *pWin = QWindow::fromWinId((WId)hwndList.at(0));
pWin->setGeometry(0,0,this->width(),this->height());
QWidget *widget = QWidget::createWindowContainer(pWin);
widget->setMouseTracking(true);//鼠标跟踪
widget->setParent(this);
QList<HWND> Widget::GetWindowHandleListByPID(QString filename)//通过进程标题获取窗口进程ID
{
QString str_title = filename+" - WPS Office";//进程标题固定格式
QList<HWND> HWND_list;
HWND h = ::GetTopWindow(0);
while (h)
{
DWORD pid = 0;
DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);
if (dwTheardId != 0)
{
TCHAR *name=new TCHAR[MAX_PATH];
//::GetClassName(h, name, 255);
::GetWindowTextW(h, name, 255);
QString title = QString :: fromStdWString(name);
qDebug()<<title;//pp.ppt - WPS Office" "WPS演示 幻灯片放映 - [pp.ppt]
if(title == str_title)
{
HWND_list.append(h);
}
}
h = ::GetNextWindow(h, GW_HWNDNEXT);
}
return HWND_list;//最终只会返回一个进程ID
}
4.
#include <windows.h>
#include <QAxObject>
#include <QMessageBox>
#include <QFileDialog>
#include <QDebug>
#include <QWindow>
5.运行结果-成功嵌入,并可以正常操作ppt