0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何嵌入第三方可执行程序

jf_xutpKvFS 来源:LabVIEW QT 修炼之路 作者:LabVIEW QT 修炼之路 2022-11-01 09:54 次阅读

LabVIEW:2015

你可能碰到过这种需求:需要在自己开发的应用程序中嵌入某个第三方的可执行程序,那么该如何实现呢?其实是很简单的,借助Windows API,简单几步即可完成:

1. 找到待嵌入的窗体句柄,使用WinAPI:

HWND FindWindowA(

[in, optional] LPCSTR lpClassName,

[in, optional] LPCSTR lpWindowName

);

参数的详细描述如下图所示:

aecc237c-593d-11ed-a3b6-dac502259ad0.png

从描述中可以看到,通过窗口的标题来查找句柄是简单可行的方式(当有多个标题相同的窗体时,需要用窗体类名来区分),但是此时 lpClassName需要传入NULL值,但LabVIEW中并没有办法直接创建NULL值,参考官方给出的解决方案1是可行的(按照值传递的方式传入0,大多数时候DLL会视作指针类型参数传入的是NULL值),如下图所示:

af0f4cec-593d-11ed-a3b6-dac502259ad0.png

于是封装 FindWindowA() 函数如下图所示:

af2ab964-593d-11ed-a3b6-dac502259ad0.png

af438d18-593d-11ed-a3b6-dac502259ad0.png

af605fd8-593d-11ed-a3b6-dac502259ad0.png

另外如果你想获取任一窗体的类名和标题名,借用Spy++工具是很容易的,可以自行搜索下载,当然如果你按照了Visual Studio也是带的有的,如下图所示:

af6ef2fa-593d-11ed-a3b6-dac502259ad0.png

af84e8ee-593d-11ed-a3b6-dac502259ad0.png

比如将查找程序工具拖拽到TEST.exe的窗体标题栏上,如下图所示:

afa07d0c-593d-11ed-a3b6-dac502259ad0.png

2.设置带嵌入窗体的父窗体,使用WinAPI:

HWND SetParent(

[in] HWND hWndChild,

[in, optional] HWND hWndNewParent

);

参数的详细描述如下图所示:

afbdff76-593d-11ed-a3b6-dac502259ad0.png

这两个参数比较简单,无需多解释,封装 SetParent() 函数如下图所示:

afdd0b00-593d-11ed-a3b6-dac502259ad0.png

b0018c6e-593d-11ed-a3b6-dac502259ad0.png

b018eb2a-593d-11ed-a3b6-dac502259ad0.png

那么如何获取LabVIEW编写的VI窗体句柄呢?这里提供两种方式:

通过上面封装的 FindWinowA() 函数,传入窗体标题来获取;

通过VI的Front Panel Window.Native Window属性直接获取,但是该属性默认是隐藏的,需要在LabVIEW.ini配置文件中加上:SuperSecretPrivateSpecialStuff=True,重启LabVIEW即可;

b02941dc-593d-11ed-a3b6-dac502259ad0.png

有了上述两个API其实就已经可以把第三方exe嵌入到VI中了,但是窗体没有重绘,效果可能是窗体已经嵌入但是是空白的(如下图所示),需要自己拖动一下窗口或调整其大小才能恢复,另外嵌入时没有办法去控制嵌入的位置和窗体大小,显然这并不够完美,那么还需借助几个API来达到理想的效果。

b0394a14-593d-11ed-a3b6-dac502259ad0.png

3. 获取窗体的边界尺寸,使用WinAPI:

BOOL GetWindowRect(

[in] HWND hWnd,

[out] LPRECT lpRect

);

参数详细描述如下图所示:

b04fbd8a-593d-11ed-a3b6-dac502259ad0.png

参数也比较简单,只是第二个参数是一个结构体指针,这里需要用一个空类型指针来接收,传入适配类型簇(包含四个Int32数值元素),封装如下图所示:

b0635ebc-593d-11ed-a3b6-dac502259ad0.png

b0748d5e-593d-11ed-a3b6-dac502259ad0.png

b086cf32-593d-11ed-a3b6-dac502259ad0.png

4. 移到窗体位置并设置大小,使用WinAPI:

BOOL MoveWindow(

[in] HWND hWnd,

[in] int X,

[in] int Y,

[in] int nWidth,

[in] int nHeight,

[in] BOOL bRepaint

);

参数详细描述如下图所示:

b09d9dfc-593d-11ed-a3b6-dac502259ad0.png

封装如下图所示:

b0b1cd90-593d-11ed-a3b6-dac502259ad0.png

b0c926de-593d-11ed-a3b6-dac502259ad0.png5.   

5.更改指定窗口的属性,使用WinAPI:

LONG SetWindowLongA(

[in] HWND hWnd,

[in] int nIndex,

[in] LONG dwNewLong

);

详细参数描述如下图所示:

b0e2ad84-593d-11ed-a3b6-dac502259ad0.png

关于窗口样式有很多种,这里不便展出,详细请参考官方描述,链接如下:

https://learn.microsoft.com/zh-cn/windows/win32/winmsg/window-styles

封装如下图所示:

b1017160-593d-11ed-a3b6-dac502259ad0.png

b113e41c-593d-11ed-a3b6-dac502259ad0.png

6. 指定窗体的显示状态,使用WinAPI:

BOOL ShowWindow(

[in] HWND hWnd,

[in] int nCmdShow

);

详细参数描述如下图所示:

b124f126-593d-11ed-a3b6-dac502259ad0.png

封装如下图所示:

b13a382e-593d-11ed-a3b6-dac502259ad0.png

b1533e0a-593d-11ed-a3b6-dac502259ad0.png

7.发送指定消息到窗口,使用WinAPI:

LRESULT SendMessageA(

[in] HWND hWnd,

[in] UINT Msg,

[in] WPARAM wParam,

[in] LPARAM lParam

);

详细参数如下图所示:

b1622da2-593d-11ed-a3b6-dac502259ad0.png

官方文档中提到更改窗口的父级时,应同步这两个窗口的 UISTATE。有关详细信息,请参阅WM_CHANGEUISTATE和WM_UPDATEUISTATE。封装如下:

b172af56-593d-11ed-a3b6-dac502259ad0.png

b18cf686-593d-11ed-a3b6-dac502259ad0.png

嵌入一个LabVIEW开发的可执行程序如下图所示:

b1a29c84-593d-11ed-a3b6-dac502259ad0.png

b1c5a878-593d-11ed-a3b6-dac502259ad0.png

嵌入Excel应用程序如下图所示:

b1dae3dc-593d-11ed-a3b6-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LabVIEW
    +关注

    关注

    1970

    文章

    3654

    浏览量

    323368
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61970
  • 应用程序
    +关注

    关注

    37

    文章

    3267

    浏览量

    57683

原文标题:如何嵌入第三方可执行程序

文章出处:【微信号:LabVIEW QT 修炼之路,微信公众号:LabVIEW QT 修炼之路】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview如何内嵌操作第三方EXE程序

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    如何打开第三方软件

    请问大神们 谁知道如何在Labview中 打开第三方软件,我现在想打开工程后 自动打开USB视频采集卡,然后就直接显示出采集卡采集到的图像了请问如何打开在这先谢过了
    发表于 09-11 16:26

    如何把第三方库加到PROTEUS中?

    新手求教,弱弱的问下,下了一个第三方库,说是要先安装,再添加路径,可是我下来的第三方库没有看到安装文件啊。还望指教如何添加!
    发表于 06-15 22:32

    如何在LabVIEW中嵌入第三方软件界面

    如何把第三方软件的界面嵌入到labview中,并且能够在LabVIEW的前面板中对第三方软件进行操作。LabVIEW中有Active用于IE回调的例子,可以在LabVIEW前面板中操作IE。想把IE换成
    发表于 04-27 23:06

    第三方dll调用问题!!!

    第三方dll,没有.h,labview怎么实现调用,dll可以用VS打开,类库说明也有
    发表于 05-11 09:14

    LabVIEW与第三方软件交互问题

    现在做一个软件,就是通过LabVIEW去与第三方软件进行交互操作!已经通过百度找到了利用user32.dll调用FindWindowA与PostMessage去实现对计算器,找了多方资料也没有找到解决办法。想做一个软件就是对图片2中第三方软件中控件进行控制的方法谢谢各位帮
    发表于 12-26 17:13

    下载python第三方

    python第三方库的下载
    发表于 07-02 13:12

    国内知名第三方检测认证机构排名

    的某个客体,我们把它叫作第三方第三方可以是和两个主体有联系,也可以是独立于两个主体之外,是由处于买卖利益之外的第三方(如专职监督检验机构),以公正、权威的非当事人身份,根据有关法律、标准或合同所进行
    发表于 07-19 16:57

    关于LabVIEW调用第三方exe,如何去控制第三方exe按钮的问题

    我想调用第三方的exe,但并没有给出任何接口,就单单一个exe程序,通过查资料得出可以用window自带的user32.dll可以控制第三方的软件,通过FindWindowA函数找到该软件句柄,通过
    发表于 08-12 16:37

    头文件中包含第三方文件

    macrocmake如果源文件(例如 CPP)中包含第三方头文件,但是头文件(例如 hpp)中不包含该第三方文件头,采用 PRIVATE。如果源文件和头文件中都包含该第三方文件头,采用 PUBLIC
    发表于 08-18 08:10

    银行和第三方支付:恋爱进行时

    银行和第三方支付:恋爱进行时   北京2010年1月8日电  -- 从第三方支付诞生之时起,银行与第三方支付之间的竞合关系
    发表于 01-09 08:08 664次阅读

    基于第三方信号无源探测系统研究

    文中主要讨论了基于第三方信号检测隐形目标的无源探测系统,并对侦察第三方信号作用距离和基于第三方信号无源探测系统的作用距离进行仿真,证明基于第三方信号无源探测系统在检测
    发表于 03-01 15:35 29次下载
    基于<b class='flag-5'>第三方</b>信号无源探测系统研究

    第三方实例:iView开发介绍 (1)

    第三方实例介绍 - iView (1)
    的头像 发表于 08-22 01:42 4368次阅读

    C++串口程序第三方类代码免费下载

    本文档的主要内容详细介绍的是C++串口程序第三方类代码免费下载。
    发表于 09-11 08:00 7次下载
    C++串口<b class='flag-5'>程序</b><b class='flag-5'>第三方</b>类代码免费下载

    第三方脚本成为网络攻击“重灾区”,多管齐下防范第三方脚本安全隐患

      第三方脚本攻击利用的是第一网站对第三方脚本的控制力不足和难以实现的全面监测,造成较为严重的攻击后果。除此之外,第三方脚本还会带来一些其他的潜在隐患。综合来看,
    的头像 发表于 09-04 14:51 3579次阅读