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

 在开发系统的时候经常需要嵌入外部的程序,比如将企业原有的系统集成到我们的系统中,而且要求看起来像和我们的程序一样嵌入到我们的系统中,这时就要借助于Win32了。在以前使用VC、Delphi、C#开发的使用的时候可以直接调用Win32的API来操作,好在SWT中提供了Win32API的封装,而且封装的比较好,大部分都在org.eclipse.swt.internal.win32.OS这个类中。核心原理就是调用SetParent这个API将我们的程序中的某个控件设置为被嵌套程序的父窗口。具体原理可以参考我以前写的《 WPF中嵌入普通Win32程序的方法  》( http://www.blogjava.net/huanzhugege/archive/2008/04/24/195516.html )。
主要代码如下:
 private void executeProg(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 startNotePad() throws Exception {
  //"notepad.exe"为待启动的程序名
  executeProg("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);
 } 

全部代码在此下载:http://www.blogjava.net/Files/huanzhugege/swtwin32.zip
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值