嵌入cmd命令行

来源:互联网 发布:广东富云软件科技 编辑:程序博客网 时间:2024/06/06 05:54
 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);
}
}