展开全部
需要添加包:jna-4.5.1.jar, jna-platform-4.5.1.jarimport java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT.HANDLE;
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private Vector myData;
private int columnCount;
public MyTableModel(Vector myData, int columnCount) {
e68a843231313335323631343130323136353331333365633933
this.myData = myData;
this.columnCount = columnCount;
}
@Override
public int getRowCount() {
return myData.size();
}
@Override
public int getColumnCount() {
return this.columnCount;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
try {
String[] info = (String[]) myData.get(rowIndex);
return info[columnIndex];
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void clear() {
myData.clear();
}
public void addRow(String[] row) {
myData.add(row);
}
}
public class App extends JFrame {
private static final long serialVersionUID = 1L;
private MyTableModel processTableModel;
private JTable processTable;
private MyTableModel moduleTableModel;
private JTable moduleTable;
private JLabel lblStatus;
public App() {
this.setTitle("进程管理器");
this.setSize(600, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
JToolBar toolbar = new JToolBar();
JButton btnRefresh = new JButton("刷新");
btnRefresh.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reloadProcessList();
}
});
toolbar.add(btnRefresh);
JButton btnTerminate = new JButton("结束进程");
btnTerminate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int rowIndex = processTable.getSelectedRow();
if(rowIndex == -1) {
JOptionPane.showMessageDialog(App.this, "请选择需要结束的进程。");
return;
}
String value = (String)processTable.getValueAt(rowIndex, 0);
boolean result = TerminateProcess(Integer.parseInt(value));
if(result) {
reloadProcessList();
btnRefresh.doClick();
JOptionPane.showMessageDialog(App.this, "进程[" + value + "]已结束。");
} else {
JOptionPane.showMessageDialog(App.this, "无法结束进程[" + value + "]。");
}
}
});
toolbar.add(btnTerminate);
this.add(toolbar, BorderLayout.NORTH);
JPanel bodyPanel = new JPanel();
bodyPanel.setLayout(new GridLayout(2, 1));
JPanel processPanel = new JPanel();
processPanel.setLayout(new BorderLayout());
processPanel.add(new JLabel("进程:"), BorderLayout.NORTH);
processTableModel = new MyTableModel(new Vector(), 2);
TableColumnModel columnModel = new DefaultTableColumnModel();
TableColumn column = new TableColumn(0, 50);
column.setHeaderValue("进程ID");
columnModel.addColumn(column);
column = new TableColumn(1, 200);
column.setHeaderValue("进程名称");
columnModel.addColumn(column);
this.processTable = new JTable(processTableModel, columnModel);
processTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
processTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()) {
String value = (String)processTable.getValueAt(e.getFirstIndex(), 0);
DWORD dwPID = new DWORD(Integer.parseInt(value));
reloadModuleList(dwPID);
}
}
});
processPanel.add(new JScrollPane(processTable), BorderLayout.CENTER);
bodyPanel.add(processPanel);
JPanel modulePanel = new JPanel();
modulePanel.setLayout(new BorderLayout());
modulePanel.add(new JLabel("模块:"), BorderLayout.NORTH);
moduleTableModel = new MyTableModel(new Vector(), 2);
columnModel = new DefaultTableColumnModel();
column = new TableColumn(0, 100);
column.setHeaderValue("名称");
columnModel.addColumn(column);
column = new TableColumn(1, 200);
column.setHeaderValue("路径");
columnModel.addColumn(column);
this.moduleTable = new JTable(moduleTableModel, columnModel);
modulePanel.add(new JScrollPane(moduleTable), BorderLayout.CENTER);
bodyPanel.add(modulePanel);
this.add(bodyPanel, BorderLayout.CENTER);
lblStatus = new JLabel();
this.add(lblStatus, BorderLayout.SOUTH);
reloadProcessList();
}
private void reloadProcessList() {
processTableModel.clear();
HANDLE hSnapshot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new DWORD(0));
Tlhelp32.PROCESSENTRY32.ByReference pe = new Tlhelp32.PROCESSENTRY32.ByReference();
boolean result = Kernel32.INSTANCE.Process32First(hSnapshot, pe);
while(result) {
String[] processInfo = {
pe.th32ProcessID.toString(),
String.valueOf(pe.szExeFile).trim()
};
processTableModel.addRow(processInfo);
result = Kernel32.INSTANCE.Process32Next(hSnapshot, pe);
}
Kernel32.INSTANCE.CloseHandle(hSnapshot);
processTable.updateUI();
moduleTableModel.clear();
moduleTable.updateUI();
lblStatus.setText("进程数量:" + processTableModel.getRowCount());
}
private void reloadModuleList(DWORD dwPID) {
moduleTableModel.clear();
lblStatus.setText("");
if(dwPID.intValue() == 0) {
lblStatus.setText("无法获取进程[System Process]的模块。");
return;
}
HANDLE hSnapshot = Kernel32.INSTANCE.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPMODULE, dwPID);
Tlhelp32.MODULEENTRY32W.ByReference me = new Tlhelp32.MODULEENTRY32W.ByReference();
boolean result = Kernel32.INSTANCE.Module32FirstW(hSnapshot, me);
if(!result) {
lblStatus.setText("无法获取进程[" + dwPID.intValue() + "]的模块。");
}
while(result) {
String[] moduleInfo = {
String.valueOf(me.szModule).trim(),
String.valueOf(me.szExePath).trim()
};
moduleTableModel.addRow(moduleInfo);
result = Kernel32.INSTANCE.Module32NextW(hSnapshot, me);
}
Kernel32.INSTANCE.CloseHandle(hSnapshot);
if(moduleTableModel.getRowCount() > 0) {
lblStatus.setText("进程[" + dwPID.intValue() + "]共有" + moduleTableModel.getRowCount() + "个模块。");
}
moduleTable.updateUI();
}
private boolean TerminateProcess(int dwPID) {
HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(Kernel32.PROCESS_TERMINATE, false, dwPID);
if(hProcess == Kernel32.INVALID_HANDLE_VALUE) {
return false;
}
boolean result = Kernel32.INSTANCE.TerminateProcess(hProcess, 0);
Kernel32.INSTANCE.CloseHandle(hProcess);
return result;
}
public static void main(String[] args) {
App app = new App();
app.setVisible(true);
}
}