如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

          公告

          “如鵬教育”(http://www.RuPeng.com )是一個為計算機、信息等IT類專業在校大學生服務的學習社區。 每周舉辦免費講座,為大一新生答疑解惑,幫大二、大三學生解決學習問題,幫同學提高實戰開發能力,幫大四學生增強求職技巧,成功應聘名企。

          常用鏈接

          留言簿(83)

          隨筆分類

          隨筆檔案

          新聞檔案

          相冊

          友情鏈接

          團隊成員

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

              在開發系統的時候經常需要嵌入外部的程序,比如將企業原有的系統集成到我們的系統中,而且要求看起來像和我們的程序一樣嵌入到我們的系統中,這時就要借助于Win32了。在以前使用VC、Delphi、C#開發的使用的時候可以直接調用Win32的API來操作,好在SWT中提供了Win32API的封裝,而且封裝的比較好,大部分都在org.eclipse.swt.internal.win32.OS這個類中。核心原理就是調用SetParent這個API將我們的程序中的某個控件設置為被嵌套程序的父窗口。具體原理可以參考我以前寫的《WPF中嵌入普通Win32程序的方法 》(http://www.aygfsteel.com/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.aygfsteel.com/Files/huanzhugege/swtwin32.zip
          posted on 2008-06-05 10:49 CowNew開源團隊 閱讀(3758) 評論(2)  編輯  收藏

          評論

          # re: SWT程序中嵌入第三方程序的窗口 2008-06-06 10:24 BeanSoft
          謝謝分享!  回復  更多評論
            

          # re: SWT程序中嵌入第三方程序的窗口 2012-03-20 15:16 sjq
          那在linux下沒有ole對象,怎么實現呢???  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 威远县| 珠海市| 武穴市| 台南县| 乐亭县| 大洼县| 加查县| 鹤岗市| 鹤壁市| 广州市| 大竹县| 出国| 鄂伦春自治旗| 商南县| 桓仁| 铅山县| 温州市| 来安县| 亳州市| 湾仔区| 高雄县| 广宁县| 昌邑市| 平谷区| 合作市| 阆中市| 盐城市| 三原县| 无为县| 富源县| 全椒县| 雅江县| 巩留县| 芜湖县| 富蕴县| 榆中县| 三江| 昌江| 东乡| 盐池县| 阿巴嘎旗|