QT 集成外部程序

最近项目组有这么一个需求,我们的QT项目需要引入第三方开发的程序,通过快捷键或者按钮都可以触发。

作为猿人的我,终于实现了。具体方案各有缺陷:

方案一:

1. 利用QProcess类,启动第三方程序;

    2. 利用Windows API 函数FindWindow 获取窗口的句柄;函数的具体说明这里就不介绍了,可以参考以下链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

3.  利用QWindow类找到句柄所对应的窗口 QWindow *m_window=QWindow::fromWinId(wid);

4. 可以调用QWindow的CreateWindowContainter函数创建窗口的Widget,具体函数说明见下图:


5. 可以将创建的QWidget 像普通的窗口一样。

具体代码可以参考以下链接 转载自 http://blog.csdn.net/jiaoyaziyang/article/details/49802993

方案一可以实现,但是不能鼠标操作第三方的程序,这是最大的缺陷,我也不知道怎么弄。当然缺陷在上面的文档中也有说明。

方案二:不创建QWidget 窗口,直接调用QWindow的setGeometry、show、hide函数实现,当然在显示前还是需要调用一下requestActivate来达到鼠标键盘可操作的目的。类似代码如下:

     // strWindowTitle 是第三方程序的标题
       m_pWnd = FindWindow(NULL, strWindowTitle.toStdWString().data());
	QWindow *pWd = QWindow::fromWinId((WId)m_pWnd);
        
pWd->setGeometry(0,0,640,480);
pWd->requestActivate();pWd->show();
 

方案三:既然是Windows平台,哪么我们就用WindowsAPI 来实现,使用到的函数主要有MoveWindow、ShowWindow 的API实现。示例代码如下,供参考:

// 第三方程序的初始化状态,注意这个初始化要根据第三方程序是否能最小化有关,专业术语就是 Window Styles
const int nShowCmd = SW_MINIMIZE;

// 第三方程序的句柄
HWND m_pWnd;

// 初始化函数
void init()
{
	m_pWnd = FindWindow(NULL, strWindowTitle.toStdWString().data());
	if (!m_pWnd && !IsWindow(m_pWnd))
	{
		return;
	}
	MoveWindow(m_pWnd, 160, 60, 1500, 960, true);
	ShowWindow(m_pWnd, nShowCmd);
}

// 显示的代码
void show()
{
	if (!m_pWnd && !IsWindow(m_pWnd))
	{
		return;
	}
	MoveWindow(m_pWnd, 160, 60, 1500, 960, true);

	ShowWindow(m_pWnd, SW_SHOWNORMAL);
}

// 隐藏代码
void U20Demo::slotHide()
{
	if (!m_pWnd && !IsWindow(m_pWnd))
	{
		return;
	}
	ShowWindow(m_pWnd, nShowCmd);
	QApplication::setActiveWindow(this);
}
方案三的初始化状态,可使用的状态可以根据VS 的Spy++ 工具查看,我以截图工具示例如下:


特别注意黄色区域的WindowStyle ,不然同一个Style部分程序不起作用,部分起作用。

可以考虑SW_HIDE,这样大部分程序支持隐藏吧!!!要不然走弯路,不要怪我咯!!!


方案四:我们可以和第三方程序通过共享内存的方式交互控制参数,但是这个需要第三方配合,比较麻烦。

我没有实现,但是一定是可行的方案。

方案五:我们可以启动第三方的程序时,传递控制显示参数。方案一定可行哦!!!!



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值