実際のプロジェクト開発では、要件と実装方法が奇妙であることが多く、異なる要件を達成するために異なる言語が使用されることもあります。
今回は、windows システムにおいて、異なるプログラム間でのウィンドウの入れ子を実現します。
使用したツールキット:
- org.eclipse.swt.win32.win32.x86_3.100.1.v4234e.jar
- org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar
各プログラム間の起動シーケンスと時間は不確実であるため、ウィンドウをマージするタスクを実行するためにスレッドが使用されます。循環して、スレッド内の各プログラムのウィンドウ ハンドルを検索し、それらをマージします。
コードが単純すぎて、詳細な分析が行われていないため、自分で確認してください。
注目すべき箇所は以下の2点です。
-
GlassWndClass-GlassWindowClass-2 はウィンドウ タイプであり、Microsoft_Spy++ ソフトウェアで表示できます。 AppName は、ウィンドウのタイトル、つまりウィンドウのタイトル バーの名前です。
Toolkit と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);
}
}
}
}