在实际项目开发中,往往需求和实现方式千奇百怪,有时候会用不同的语言去实现不同的需求。
本次实现在windows系统中,不同程序之间的窗口嵌套。
用到的工具包:
- org.eclipse.swt.win32.win32.x86_3.100.1.v4234e.jar
- org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar
由于每个程序之间的启动顺序和时间都不确定,因此,使用线程去做合并窗口的任务。在线程中循环查找各个程序的窗口句柄,然后进行合并。
代码过于简单,不做详细分析了,请自行查看。
需要注意的地方有两个,如下:
-
GlassWndClass-GlassWindowClass-2为窗口类型,可以使用Microsoft_Spy++软件进行查看。 AppName为窗口的title,即窗口标题栏的名称。
工具包和Microsoft_Spy++下载地址:
windows不同程序窗口合并工具包-桌面系统文档类资源-CSDN下载
package com.rtcce.ugv.view;
import com.rtcce.ugv.MainApp;
import com.rtcce.ugv.common.Constants;
import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;
public class ShowDesktopThread extends Thread
{
private static Logger LOG = Logger.getLogger(ShowDesktopThread.class);
private long childD360 = 0;
private long childFpv = 0;
private long childTask = 0;
private long parent = 0;
private boolean succeed = false;
public void run()
{
while (MainApp.running && !succeed)
{
try
{
if(parent == 0)
{
parent = OS.FindWindow(new TCHAR(0, "GlassWndClass-GlassWindowClass-2", true),new TCHAR(0, Constants.AppName, true));
}
if (parent == 0)
{
Thread.sleep(1000);
continue;
}
if(childD360 == 0)
{
childD360 = OS.FindWindow(new TCHAR(0, "SunAwtFrame", true), new TCHAR(0, "D360", true));
if(childD360 != 0)
{
OS.SetWindowPos(childD360, OS.HWND_TOPMOST, 50 , 0, 1225, 720, SWT.NULL);
OS.SetParent(childD360, parent);
}
}
if(childFpv == 0)
{
childFpv = OS.FindWindow(new TCHAR(0, "SunAwtFrame", true), new TCHAR(0, "FPV", true));
if(childFpv != 0)
{
OS.SetWindowPos(childFpv, OS.HWND_TOPMOST, 1280 , 0, 1280, 720, SWT.NULL);
OS.SetParent(childFpv, parent);
}
}
if(childTask == 0)
{
childTask = OS.FindWindow(new TCHAR(0, "SunAwtFrame", true), new TCHAR(0, "TASK", true));
if(childTask != 0)
{
OS.SetWindowPos(childTask, OS.HWND_TOPMOST, 2565 , 0, 768, 432, SWT.NULL);
OS.SetParent(childTask, parent);
}
}
if (childD360 != 0 && childFpv != 0 && childTask != 0)
{
succeed = true;
}
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
//nothing
}
}
catch (Exception e)
{
LOG.error(e.getMessage(), e);
}
}
}
}