本帖最后由 zhaogehaolaopo 于 2010-06-29 11:15:16 编辑

解决方案 »

  1.   

    按样子做一个 后台调用Runtime的exec方法
      

  2.   

    用ruantime我知道可以启动应用,但我想嵌入进去。
    谁能给我点思路。
    谢谢!
      

  3.   

    http://www.weamax.com/xinjingji/xinjishu/JAVA_anquan/2009/0804/19897.htmlLZ实验下吧 既然知道存在这个东西就应该多搜索才是
      

  4.   

    根据 BearKin 的提示写了一个
    package test;import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.internal.win32.OS;
    import org.eclipse.swt.internal.win32.SHELLEXECUTEINFO;
    import org.eclipse.swt.internal.win32.TCHAR;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;public class Main { private Shell sShell = null; // @jve:decl-index=0:visual-constraint="10,10"
    private Composite composite = null;
    private Button button = null; /**
     * This method initializes composite
     * 
     */
    private void createComposite() {
    composite = new Composite(sShell, SWT.NONE);
    composite.setLayout(new GridLayout());
    composite.setBounds(new Rectangle(3, 41, 418, 195));
    } /**
     * @param args
     */
    public static void main(String[] args) {
    Display display = Display.getDefault();
    Main thisClass = new Main();
    thisClass.createSShell();
    thisClass.sShell.open(); while (!thisClass.sShell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    display.dispose();
    } /**
     * This method initializes sShell
     */
    private void createSShell() {
    sShell = new Shell();
    sShell.setText("Shell");
    createComposite();
    sShell.setSize(new Point(434, 270));
    sShell.setLayout(null);
    button = new Button(sShell, SWT.NONE);
    button.setText("启动");
    button.setBounds(new Rectangle(10, 4, 110, 22));
    button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
    @Override
    public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
    try {
    startCMD();
    } catch (Exception e1) {
    e1.printStackTrace();
    }
    }
    });
    } 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);
    } protected void startCMD() throws Exception {
    // "notepad.exe"为待启动的程序名
    executeProg("cmd.exe"); // 等待NotePad.exe启动并且初始化完毕,需要根据实际情况调整sleep的时间
    Thread.sleep(1000); // "Notepad"为被嵌套程序窗口的ClassName(Win32级别),可以使用Spy++等工具查看
    int notepadHwnd = OS.FindWindow(new TCHAR(0, "ConsoleWindowClass", 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);
    }
    }
      

  5.   

    可以看看jedit的Console插件的源代码
    http://sourceforge.net/projects/jedit-plugins/files/
      

  6.   

    感谢BearKin为我指路。
    感谢desolatecity安贞BearKin的提示搜索、并修改了适用于我的代码。