JFrame窗体怎么嵌入一个cmd命令窗体? 本帖最后由 zhaogehaolaopo 于 2010-06-29 11:15:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 按样子做一个 后台调用Runtime的exec方法 用ruantime我知道可以启动应用,但我想嵌入进去。谁能给我点思路。谢谢! http://www.weamax.com/xinjingji/xinjishu/JAVA_anquan/2009/0804/19897.htmlLZ实验下吧 既然知道存在这个东西就应该多搜索才是 根据 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); }} 可以看看jedit的Console插件的源代码http://sourceforge.net/projects/jedit-plugins/files/ 感谢BearKin为我指路。感谢desolatecity安贞BearKin的提示搜索、并修改了适用于我的代码。 服务器程序启动与停止 请问如何吧这个程序的结果输出到一个txt文件中啊? 喜欢GUI的朋友,介绍个网址给你们 函数调用 小问题 重绘问题 jtree和jscrollpane的问题 谁有用年nio写的客户端和服务器端来进行多人通讯的例子? 有关LDAP权限管理的高级问题 一个小问题~~~关于截取字符串 在linux中命令行:我在哪里添加一个回车?就会让他出现如下这种状态 Java中,关于return关键字的实行原理有所疑问 定义变量同时调用其他类方法给变量赋值为什么一定要定义为final?
谁能给我点思路。
谢谢!
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);
}
}
http://sourceforge.net/projects/jedit-plugins/files/
感谢desolatecity安贞BearKin的提示搜索、并修改了适用于我的代码。