前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SWT程序中嵌入第三方程序的窗口

SWT程序中嵌入第三方程序的窗口

作者头像
BUG弄潮儿
发布2022-06-30 14:47:56
4270
发布2022-06-30 14:47:56
举报
文章被收录于专栏:JAVA乐园

在开发系统的时候经常需要嵌入外部的程序,比如将企业原有的系统集成到我们的系统中,而且要求看起 来像和我们的程序一样嵌入到我们的系统中,这时就要借助于Win32了。在以前使用VC、Delphi、C#开发的 使用的时候可以直接调用Win32的API来操作,好在SWT中提供了Win32API的封装,而且封装的比较好,大部 分都在org.eclipse.swt.internal.win32.OS这个类中。核心原理就是调用SetParent这个API将我们的程序中的某个控件设置为被嵌套程序的父窗口。

核心代码如下:

private void execute(String fileName) throws Exception {

int hHeap = OS.GetProcessHeap ();

TCHAR buffer = new TCHAR (0, fileName, true);

int byteCount = buffer.length () * TCHAR.sizeof;

int lpFile = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);

OS.MoveMemory (lpFile, buffer, byteCount);

SHELLEXECUTEINFO info = new SHELLEXECUTEINFO ();

info.cbSize = SHELLEXECUTEINFO.sizeof;

//隐藏启动

info.lpFile = lpFile;

info.nShow = OS.SW_HIDE;

boolean result = OS.ShellExecuteEx (info);

if (lpFile != 0) {

OS.HeapFree (hHeap, 0, lpFile);

}

if(result==false){

throw new Exception("启动失败!");

}

}

protected void startThirdExe() throws Exception {

//"notepad.exe"为待启动的程序名

execute("notepad.exe");

//等待NotePad.exe启动并且初始化完毕,需要根据实际情况调整sleep的时间

Thread.sleep(1000);

//"Notepad"为被嵌套程序窗口的ClassName(Win32级别),可以使用Spy++等工具查看

int notepadHwnd = OS.FindWindow(new TCHAR(0,"Notepad",true),null);

//&~WS_BORDER去掉内嵌程序边框,这样看起来更像一个内嵌的程序。如果需要显示边框,则将这两行代 码删除

int oldStyle = OS.GetWindowLong(notepadHwnd, OS.GWL_STYLE);

OS.SetWindowLong(notepadHwnd, OS.GWL_STYLE, oldStyle&~OS.WS_BORDER);

//composite为承载被启动程序的控件

OS.SetParent(notepadHwnd, composite.handle);

//窗口最大化

OS.SendMessage(notepadHwnd, OS.WM_SYSCOMMAND, OS.SC_MAXIMIZE, 0);

}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档