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

在開發系統的時候常常須要嵌入外部的程序,好比將企業原有的系統集成到咱們的系統中,並且要求看起來像和咱們的程序同樣嵌入到咱們的系統中,這時就要藉助於Win32了。在之前使用VC、Delphi、C#開發的使用的時候能夠直接調用Win32的API來操做,好在SWT中提供了Win32API的封裝,並且封裝的比較好,大部分都在org.eclipse.swt.internal.win32.OS這個類中。核心原理就是調用SetParent這個API將咱們的程序中的某個控件設置爲被嵌套程序的父窗口。具體原理能夠參考我之前寫的《 WPF中嵌入普通Win32程序的方法 》( [url]http://www.blogjava.net/huanzhugege/archive/2008/04/24/195516.html[/url])。
主要代碼以下:
 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);
 }

所有代碼在此下載:[url]http://www.blogjava.net/Files/huanzhugege/swtwin32.zip[/url]
相關文章
相關標籤/搜索