Qt调起外部应用并嵌入界面

最近有个项目需要在程序中调起外部应用,然后将应用显示在软件的窗口中,总结过程中遇到的问题:

1. 调起外部应用

    网上帖子很多,使用QProcess::startDetached或QProcess::start方法即可,根据自己不同需要选择不同的方法。

2. 嵌入软件界面

    主要思路如下:

    运行exe--->FindWindow获得窗口句柄--->QWindow::fromWinId获得QWindow--->createWindowContainer为QWindow对象创建容器即窗口--->设置窗口属性并显示

    在FindWindow的使用上遇到的了问题。

函数原型:

HWND WINAPI FindWindow(
  _In_opt_ LPCTSTR lpClassName,
  _In_opt_ LPCTSTR lpWindowName
);

参数列表:

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name

简述:

    lpClassName参数指向类名,lpWindowName指向窗口名,如果有指定的类名和窗口的名字则表示成功返回一个窗口的句柄。否则返回零。

这里重要的是类名或者窗口名如何寻找?为了寻找我们需要使用VS中的Spy++工具(在VS菜单栏“工具”中可以找到)。

运行目标程序(我使用的第三方软件"honestech TVR 2.5"),打开Spy++,可以看到所有窗口的信息。

Qt调起外部应用并嵌入界面_第1张图片

在这里可以找到honestech的相关窗口

Qt调起外部应用并嵌入界面_第2张图片

因为这个软件打开会有两部分,控制部分和视频窗口,honestech TVR 2.5这个是控制部分的窗口,honestech TVR - Screen是视频显示窗口。

鼠标右键菜单中有“突出显示”项,选择后对应的窗口会有一个边框闪烁几次,以便判断窗口位置。

右键菜单中的“属性”项,可以查看窗口属性,其中“常规”- 窗口标题 即为窗口名,“类”- 类名 即为所要的类名。

FindWindow的两个参数填入一个即可查找到窗口句柄:

WId wid = (WId)FindWindow(NULL, L"honestech TVR - Screen");

问题1:

有的窗口类名为空,或者标题为空,或者是一个很奇怪的名称,不知道怎么搞,比如类名为“#32770 (对话框)”

问题2:

获取句柄应该是需要等待窗口的启动,有些时候参数正确但却获取不到句柄,在代码之前增加延时又可以获取到了,不知道我判断的原因是否正确。


既然FindWindow是获取顶级窗口的句柄,那自然也得有个获取子窗口句柄的方法吧,这里找到EnumChildWindows函数,抽空再研究研究

你可能感兴趣的:(Qt)