java exe swt

来源:互联网 发布:禁毒网络知识竞赛网址 编辑:程序博客网 时间:2024/06/07 05:14
这几天找资料,突然在网上看到一篇文章,介绍怎样将一些本地窗口嵌入到java的界面中,感觉非常有趣,而且也还比较实用,就花了点心思看了,然后当了他的代码试了一下,还真不错。不过,他需要用到jni,需要用c再写一个dll,虽然可以直接用那位大哥写好的,感觉还是有点麻烦。我就在想,有没有更简单的一点的办法呢,于是又找了一找,还真让我找到了。

    这个方法,就是使用swt的org.eclipse.swt.internal.win32.OS类来实现。swt是ibm最初开发出来的,目的就是开发忠于操作系统的java界面。Windows为了方便大家开发,暴露出来了不少的api,做过win32编程的同志估计相当熟悉。swt就是使用java的jni技术,为java语言到win32的接口搭了个一一对应的桥。它只做了一个简单的对应,没有加入什么自已的逻辑,所以也就不会有多少java这边代码的bug,要有bug也是win32那些接口实现的bug。所以,它的速度和稳定性,都是Sun的awt和swing是不能比拟的。

    好了,费话不多说,下面是代码:

[java:nogutter] view plaincopyprint?
  1. import org.eclipse.swt.SWT;  
  2. import org.eclipse.swt.events.ControlAdapter;  
  3. import org.eclipse.swt.events.ControlEvent;  
  4. import org.eclipse.swt.events.DisposeEvent;  
  5. import org.eclipse.swt.events.DisposeListener;  
  6. import org.eclipse.swt.graphics.Rectangle;  
  7. import org.eclipse.swt.internal.win32.OS;  
  8. import org.eclipse.swt.internal.win32.RECT;  
  9. import org.eclipse.swt.internal.win32.SHELLEXECUTEINFO;  
  10. import org.eclipse.swt.internal.win32.TCHAR;  
  11. import org.eclipse.swt.layout.FillLayout;  
  12. import org.eclipse.swt.widgets.Composite;  
  13. import org.eclipse.swt.widgets.Display;  
  14. import org.eclipse.swt.widgets.Shell;  
  15. public class EmbedEXEIntoSWT {  
  16.     private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="10,10"  
  17.     private Composite composite = null;  
  18.     int notepadHwnd = 0;  
  19.     /** 
  20.      * @param args 
  21.      */  
  22.     public static void main(String[] args) {  
  23.         Display display = Display.getDefault();  
  24.         EmbedEXEIntoSWT thisClass = new EmbedEXEIntoSWT();  
  25.         thisClass.createSShell();  
  26.         thisClass.sShell.open();  
  27.         while (!thisClass.sShell.isDisposed()) {  
  28.             if (!display.readAndDispatch())  
  29.                 display.sleep();  
  30.         }  
  31.         display.dispose();  
  32.     }  
  33.     /** 
  34.      * This method initializes sShell 
  35.      */  
  36.     private void createSShell() {  
  37.         sShell = new Shell();  
  38.         sShell.setText("Shell");  
  39.         composite = new Composite(sShell, SWT.NONE);  
  40.         sShell.setLayout(new FillLayout());  
  41.         composite.setBackground(sShell.getDisplay().getSystemColor(SWT.COLOR_BLACK));  
  42.         composite.setBounds(0,0,800,600);  
  43.         composite.setLayout(new FillLayout());  
  44.         composite.addControlListener(new ControlAdapter() {  
  45.             public void controlResized(ControlEvent e) {  
  46.                 if (notepadHwnd != 0) {  
  47.                     Rectangle cRect = ((Composite) (e.widget)).getClientArea();  
  48.                     // 全屏   
  49.                     OS.SetWindowPos(notepadHwnd, 00,0,cRect.width, cRect.height,OS.SWP_NOZORDER | OS.SWP_NOACTIVATE | OS.SWP_ASYNCWINDOWPOS);  
  50. //                  // 居中   
  51. //                  RECT sRect = new RECT();  
  52. //                  OS.GetClientRect(notepadHwnd, sRect);  
  53. //                  int w = sRect.right - sRect.left;  
  54. //                  int h = sRect.bottom - sRect.top;  
  55. //                  OS.SetWindowPos(notepadHwnd, 0, (cRect.width - w)/2, (cRect.height - h)/2, w, h - 20, OS.SWP_NOZORDER | OS.SWP_NOACTIVATE | OS.SWP_ASYNCWINDOWPOS);  
  56.                 }  
  57.             }  
  58.         });  
  59.         sShell.addDisposeListener(new DisposeListener() {  
  60.             public void widgetDisposed(DisposeEvent arg0) {  
  61.                 if (notepadHwnd != 0) {  
  62.                     OS.SendMessage(notepadHwnd, OS.WM_CLOSE, 00);  
  63.                 }  
  64.             }  
  65.         });  
  66.         try {  
  67.             startNotePad();  
  68.         } catch (Exception e) {  
  69.         }  
  70.     }  
  71.     private boolean executeProg(String fileName) throws Exception  
  72.     {  
  73.         int hHeap = OS.GetProcessHeap ();  
  74.         TCHAR buffer = new TCHAR (0, fileName, true);  
  75.         int byteCount = buffer.length () * TCHAR.sizeof;  
  76.         int lpFile = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);  
  77.         OS.MoveMemory (lpFile, buffer, byteCount);  
  78.         SHELLEXECUTEINFO info = new SHELLEXECUTEINFO ();  
  79.         info.cbSize = SHELLEXECUTEINFO.sizeof;  
  80.         info.lpFile = lpFile;  
  81.         //隐藏启动   
  82.         info.nShow = OS.SW_HIDE;  
  83.         boolean result = OS.ShellExecuteEx (info);  
  84.         if (lpFile != 0) OS.HeapFree (hHeap, 0, lpFile);  
  85.         return result;  
  86.     }  
  87.       
  88.     protected void startNotePad() throws Exception {  
  89.         //"notepad.exe"为待启动的程序名  
  90.         executeProg("notepad.exe");  
  91.           
  92.         //"Notepad"为被嵌套程序窗口的ClassName(Win32级别),可以使用Spy++等工具查看  
  93.         while (notepadHwnd == 0) {  
  94.             notepadHwnd = OS.FindWindow(new TCHAR(0,"Notepad",true),null);  // Notepad,rsedc_wclass  
  95.             Thread.sleep(10);  
  96.         }  
  97.           
  98.         //&~WS_BORDER去掉内嵌程序边框,这样看起来更像一个内嵌的程序。如果需要显示边框,则将这两行代码删除  
  99.         int oldStyle = OS.GetWindowLong(notepadHwnd, OS.GWL_STYLE);          
  100.         OS.SetWindowLong(notepadHwnd, OS.GWL_STYLE, oldStyle&~OS.WS_BORDER);  
  101.           
  102.         //composite为承载被启动程序的控件   
  103.         OS.SetParent(notepadHwnd, composite.handle);          
  104.         //窗口最大化   
  105.         OS.SendMessage(notepadHwnd, OS.WM_SYSCOMMAND, OS.SC_MAXIMIZE, 0);  
  106.     }  
  107. }  

原创粉丝点击