用java写个键盘监听器,应该把监听器加到哪里?
不加到那个awt和swing的组件里,隐藏起来,然后用户的输入就都可以被记录下。在相关问题里看到那个人说他"在JAVA里调用了C语言的getch()函数,实现了即输入即现...
不加到那个awt和swing的组件里,隐藏起来,然后用户的输入就都可以被记录下。
在相关问题里看到那个人说他"在JAVA里调用了C语言的getch()函数,实现了即输入即现",他怎么弄的?
悬赏又提高了呀,一楼的纯属瞎混分,2楼的兄弟说的太艰深了,我只是初学者..能解决的但认为分数不够的尽管说~ 展开
在相关问题里看到那个人说他"在JAVA里调用了C语言的getch()函数,实现了即输入即现",他怎么弄的?
悬赏又提高了呀,一楼的纯属瞎混分,2楼的兄弟说的太艰深了,我只是初学者..能解决的但认为分数不够的尽管说~ 展开
5个回答
展开全部
**********补充一下啊××××××××
如果你是想真正实现键盘记录功能,那只能用消息钩子实现,具体怎么搞你搜索一下API HOOK,原理我在下面都说过了。早期的黑客软件都是这样实现的。你可以到安全焦点上看看。主要的技术有:远程线程注入、钩子、键盘消息。
另外,java的进程到底能不能注入很难说,所以我说应该用全局钩子,也就是说对所有的信息进行拦截,所以需要把函数写道DLL文件里实现内存的共享。
另外其实可以投机取巧的方法实现。比如就是空间隐藏,完全可以实现,但是要注意技巧,比如防止焦点丢失啊,因为这样键盘输入的东西就记不下来了~~~
怎么样~这样可以给分了吗?有问题再问啊~~
键盘记录器,估计java是不可能实现的。。。
涉及到windows编程。。
可以用c实现。。。原理是这样的。。
键盘被按下之后,会向窗口发送一个按键消息,这个消息传递给窗口,在窗口的消息循环中被处理,这个时候,如果用c语言写了一个钩子,加入窗口所在进程中,拦截传入的消息,从中读出按下的键是哪个就可以了。。。
java貌似不可能实现那个东西,如果有的话也肯定是钩子之类的~~~
反正进程钩子是有的,消息钩子不知道有没有。。
用c实现的步骤:
写个DLL文件,把钩子处理函数写在里面,然后导出这个函数。编译成DLL文件
然后注入进程。如果你是要在java的程序里记录,那是不可能设置为局部钩子的,只能是全局钩子!!!
java调用c是这样的:
使用jni技术:
首先java中写一个本地方法
1、然后编译这个类,然后用javah编译它,会产生一个头文件
2、在vc中包含这个头文件,重写里面的方法(这个方法和你在java中写的本地方法是对应的),同样生成一个DLL
3、java中,用System.loadLibrary加载这个dll文件,调用你写的那个方法就可以了~~~
4、键盘记录好像不能直接被java读取,可以先记录到一个文件中,java里面直接读文件了,这样还能避免用jni
你搜索一下呗~~关键字:
api hook、jni、java 钩子
如果你是想真正实现键盘记录功能,那只能用消息钩子实现,具体怎么搞你搜索一下API HOOK,原理我在下面都说过了。早期的黑客软件都是这样实现的。你可以到安全焦点上看看。主要的技术有:远程线程注入、钩子、键盘消息。
另外,java的进程到底能不能注入很难说,所以我说应该用全局钩子,也就是说对所有的信息进行拦截,所以需要把函数写道DLL文件里实现内存的共享。
另外其实可以投机取巧的方法实现。比如就是空间隐藏,完全可以实现,但是要注意技巧,比如防止焦点丢失啊,因为这样键盘输入的东西就记不下来了~~~
怎么样~这样可以给分了吗?有问题再问啊~~
键盘记录器,估计java是不可能实现的。。。
涉及到windows编程。。
可以用c实现。。。原理是这样的。。
键盘被按下之后,会向窗口发送一个按键消息,这个消息传递给窗口,在窗口的消息循环中被处理,这个时候,如果用c语言写了一个钩子,加入窗口所在进程中,拦截传入的消息,从中读出按下的键是哪个就可以了。。。
java貌似不可能实现那个东西,如果有的话也肯定是钩子之类的~~~
反正进程钩子是有的,消息钩子不知道有没有。。
用c实现的步骤:
写个DLL文件,把钩子处理函数写在里面,然后导出这个函数。编译成DLL文件
然后注入进程。如果你是要在java的程序里记录,那是不可能设置为局部钩子的,只能是全局钩子!!!
java调用c是这样的:
使用jni技术:
首先java中写一个本地方法
1、然后编译这个类,然后用javah编译它,会产生一个头文件
2、在vc中包含这个头文件,重写里面的方法(这个方法和你在java中写的本地方法是对应的),同样生成一个DLL
3、java中,用System.loadLibrary加载这个dll文件,调用你写的那个方法就可以了~~~
4、键盘记录好像不能直接被java读取,可以先记录到一个文件中,java里面直接读文件了,这样还能避免用jni
你搜索一下呗~~关键字:
api hook、jni、java 钩子
展开全部
你这个只是把从键盘输入的字母存起来没有必要做键盘监听嘛,直接用流把键盘输入的字母存在数组中不就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以放在组件中试试,虽然awt和swing组件不可见,可以设置为setVisable(false);但还是可以值得试试的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
监听器可以直接加到你的任意类上,只要在类上实现相应接口就可以了!!!!!!!!!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
package com.accp;
import java.awt.Font;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class MyFrame extends JFrame {
private JTable tbl_TotalMoney;
private JScrollPane scp_TotalMoney;
private JLabel label_1;
private JTable tbl_Money;
private JScrollPane scp_Money;
private JLabel label;
double total = 0;
int food = 0;
int ryp = 0;
int fuzhuang = 0;
int jiaotong = 0;
int tel = 0;
int jiaoji = 0;
int water = 0;
int dianfei = 0;
int meiqi = 0;
int fangfei = 0;
/**
*
*/
private static final long serialVersionUID = 2137990312542359877L;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
MyFrame frame = new MyFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the frame
*/
public MyFrame() {
super();
setBounds(100, 100, 715, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
//
}
private void initComponents() {
getContentPane().setLayout(null);
setTitle("家庭收支统计表");
label = new JLabel();
label.setFont(new Font("宋体", Font.BOLD, 16));
label.setText("家庭收支情况");
label.setBounds(175, 10, 110, 15);
getContentPane().add(label);
scp_Money = new JScrollPane();
scp_Money.setBounds(10, 31, 687, 170);
getContentPane().add(scp_Money);
//创建表头信息
String colName[] = { "日期", "食品费", "日用品费", "服装费", "交通费", "电话", "交际费",
"水费", "电费", "煤气费", "房费" };
Calendar cal = Calendar.getInstance();
// 获得当前的年份
int year = cal.get(Calendar.YEAR);
// 获得当前的月份
int month = cal.get(Calendar.MONTH) + 1;
// 获得当前月份的天数\
int days = cal.getMaximum(Calendar.DAY_OF_MONTH);
// 初始化二维数组, 用于行信息的显示(创建行数据),行数为每月天数,列数位11列,与表头对应
Object rowsData[][] = new Object[days][11];
for (int i = 0; i < days; i++) {
rowsData[i][0] = year + "-" + month + "-" + (i + 1);
}
//使用构造函数JTable(Object[][] rowData, Object[] columnNames)构建表格
tbl_Money = new JTable(rowsData, colName);
scp_Money.setViewportView(tbl_Money);
//上述是家庭收支情况表的结构
label_1 = new JLabel();
label_1.setFont(new Font("宋体", Font.PLAIN, 14));
label_1.setText("费用统计");
label_1.setBounds(10, 221, 60, 15);
getContentPane().add(label_1);
scp_TotalMoney = new JScrollPane();
scp_TotalMoney.setBounds(10, 242, 687, 89);
getContentPane().add(scp_TotalMoney);
// 定义显示所有列的信息
String colName2[] = { " ", "合计", "食品费", "日用品费", "服装费", "交通费", "电话",
"交际费", "水费", "电费", "煤气费", "房费" };
// 初始化二维数组, 显示所有的行的信息
Object rowsData2[][] = new Object[2][12];
rowsData2[0][0] = "金额";
rowsData2[1][0] = "比例";
tbl_TotalMoney = new JTable(rowsData2, colName2);
scp_TotalMoney.setViewportView(tbl_TotalMoney);
//注册事件监听器
tbl_Money.getModel().addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e) {
// 存放用户输入的字符串形式的数字、
String inputStr = "";
// 存放转换后的整形的数字
int inputInt = 0;
// 获得当前的表格的数据模型
try {
TableModel model = (TableModel) e.getSource();
inputStr = model.getValueAt(e.getFirstRow(), e.getColumn())
.toString();
// JOptionPane.showMessageDialog(null, inputStr);
inputInt = Integer.parseInt(inputStr);
// 判断用户是在哪一列输入的
switch (e.getColumn()) {
case 1:
food = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(food), 0, 2);
break;
case 2:
ryp = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(ryp), 0, 3);
break;
case 3:
fuzhuang = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(fuzhuang), 0, 4);
break;
case 4:
jiaotong = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(jiaotong), 0, 5);
break;
case 5:
tel = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(tel), 0, 6);
break;
case 6:
jiaoji = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(jiaoji), 0, 7);
break;
case 7:
water = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(water), 0, 8);
break;
case 8:
dianfei = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(dianfei), 0, 9);
break;
case 9:
meiqi = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(meiqi), 0, 10);
break;
case 10:
fangfei = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(fangfei), 0, 11);
break;
}
// 计算总费用
total = food + ryp + fuzhuang + jiaotong + tel + jiaoji
+ water + dianfei + meiqi + fangfei;
// 设置合计金额
tbl_TotalMoney.setValueAt(String.valueOf(total), 0, 1);
// 设计比例
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((food / total) * 100))
+ "%", 1, 2);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((ryp / total) * 100))
+ "%", 1, 3);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((fuzhuang / total) * 100))
+ "%", 1, 4);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((jiaotong / total) * 100))
+ "%", 1, 5);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((tel / total) * 100))
+ "%", 1, 6);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((jiaoji / total) * 100))
+ "%", 1, 7);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((water / total) * 100))
+ "%", 1, 8);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((dianfei / total) * 100))
+ "%", 1, 9);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((meiqi / total) * 100))
+ "%", 1, 10);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((fangfei / total) * 100))
+ "%", 1, 11);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "请您输入数字!!");
}
}
});
}//以上是件监听器所要做的事情
//获得每一列中的所有值得和
private int getColumnValues(int totalRow, int colIndex) {
int values = 0;
for (int i = 0; i < totalRow; i++) { // i 0
if (null == tbl_Money.getValueAt(i, colIndex))
continue;
values += Integer.parseInt(tbl_Money.getValueAt(i, colIndex)
.toString());
}
return values;
}
}
import java.awt.Font;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class MyFrame extends JFrame {
private JTable tbl_TotalMoney;
private JScrollPane scp_TotalMoney;
private JLabel label_1;
private JTable tbl_Money;
private JScrollPane scp_Money;
private JLabel label;
double total = 0;
int food = 0;
int ryp = 0;
int fuzhuang = 0;
int jiaotong = 0;
int tel = 0;
int jiaoji = 0;
int water = 0;
int dianfei = 0;
int meiqi = 0;
int fangfei = 0;
/**
*
*/
private static final long serialVersionUID = 2137990312542359877L;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
MyFrame frame = new MyFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the frame
*/
public MyFrame() {
super();
setBounds(100, 100, 715, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
//
}
private void initComponents() {
getContentPane().setLayout(null);
setTitle("家庭收支统计表");
label = new JLabel();
label.setFont(new Font("宋体", Font.BOLD, 16));
label.setText("家庭收支情况");
label.setBounds(175, 10, 110, 15);
getContentPane().add(label);
scp_Money = new JScrollPane();
scp_Money.setBounds(10, 31, 687, 170);
getContentPane().add(scp_Money);
//创建表头信息
String colName[] = { "日期", "食品费", "日用品费", "服装费", "交通费", "电话", "交际费",
"水费", "电费", "煤气费", "房费" };
Calendar cal = Calendar.getInstance();
// 获得当前的年份
int year = cal.get(Calendar.YEAR);
// 获得当前的月份
int month = cal.get(Calendar.MONTH) + 1;
// 获得当前月份的天数\
int days = cal.getMaximum(Calendar.DAY_OF_MONTH);
// 初始化二维数组, 用于行信息的显示(创建行数据),行数为每月天数,列数位11列,与表头对应
Object rowsData[][] = new Object[days][11];
for (int i = 0; i < days; i++) {
rowsData[i][0] = year + "-" + month + "-" + (i + 1);
}
//使用构造函数JTable(Object[][] rowData, Object[] columnNames)构建表格
tbl_Money = new JTable(rowsData, colName);
scp_Money.setViewportView(tbl_Money);
//上述是家庭收支情况表的结构
label_1 = new JLabel();
label_1.setFont(new Font("宋体", Font.PLAIN, 14));
label_1.setText("费用统计");
label_1.setBounds(10, 221, 60, 15);
getContentPane().add(label_1);
scp_TotalMoney = new JScrollPane();
scp_TotalMoney.setBounds(10, 242, 687, 89);
getContentPane().add(scp_TotalMoney);
// 定义显示所有列的信息
String colName2[] = { " ", "合计", "食品费", "日用品费", "服装费", "交通费", "电话",
"交际费", "水费", "电费", "煤气费", "房费" };
// 初始化二维数组, 显示所有的行的信息
Object rowsData2[][] = new Object[2][12];
rowsData2[0][0] = "金额";
rowsData2[1][0] = "比例";
tbl_TotalMoney = new JTable(rowsData2, colName2);
scp_TotalMoney.setViewportView(tbl_TotalMoney);
//注册事件监听器
tbl_Money.getModel().addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e) {
// 存放用户输入的字符串形式的数字、
String inputStr = "";
// 存放转换后的整形的数字
int inputInt = 0;
// 获得当前的表格的数据模型
try {
TableModel model = (TableModel) e.getSource();
inputStr = model.getValueAt(e.getFirstRow(), e.getColumn())
.toString();
// JOptionPane.showMessageDialog(null, inputStr);
inputInt = Integer.parseInt(inputStr);
// 判断用户是在哪一列输入的
switch (e.getColumn()) {
case 1:
food = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(food), 0, 2);
break;
case 2:
ryp = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(ryp), 0, 3);
break;
case 3:
fuzhuang = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(fuzhuang), 0, 4);
break;
case 4:
jiaotong = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(jiaotong), 0, 5);
break;
case 5:
tel = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(tel), 0, 6);
break;
case 6:
jiaoji = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(jiaoji), 0, 7);
break;
case 7:
water = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(water), 0, 8);
break;
case 8:
dianfei = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(dianfei), 0, 9);
break;
case 9:
meiqi = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney.setValueAt(String.valueOf(meiqi), 0, 10);
break;
case 10:
fangfei = getColumnValues(tbl_Money.getRowCount(), e
.getColumn());
tbl_TotalMoney
.setValueAt(String.valueOf(fangfei), 0, 11);
break;
}
// 计算总费用
total = food + ryp + fuzhuang + jiaotong + tel + jiaoji
+ water + dianfei + meiqi + fangfei;
// 设置合计金额
tbl_TotalMoney.setValueAt(String.valueOf(total), 0, 1);
// 设计比例
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((food / total) * 100))
+ "%", 1, 2);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((ryp / total) * 100))
+ "%", 1, 3);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((fuzhuang / total) * 100))
+ "%", 1, 4);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((jiaotong / total) * 100))
+ "%", 1, 5);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((tel / total) * 100))
+ "%", 1, 6);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((jiaoji / total) * 100))
+ "%", 1, 7);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((water / total) * 100))
+ "%", 1, 8);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((dianfei / total) * 100))
+ "%", 1, 9);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((meiqi / total) * 100))
+ "%", 1, 10);
tbl_TotalMoney.setValueAt(String.valueOf(Math
.round((fangfei / total) * 100))
+ "%", 1, 11);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(null, "请您输入数字!!");
}
}
});
}//以上是件监听器所要做的事情
//获得每一列中的所有值得和
private int getColumnValues(int totalRow, int colIndex) {
int values = 0;
for (int i = 0; i < totalRow; i++) { // i 0
if (null == tbl_Money.getValueAt(i, colIndex))
continue;
values += Integer.parseInt(tbl_Money.getValueAt(i, colIndex)
.toString());
}
return values;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询