JAVA Robot类 操作快捷键的具体先后问题

这个问题可能不太容易说清楚,是这样的,我希望在ROBOT操作快捷键 ctrl+c 复制文本后马上从剪贴板从特到该文本。
代码如下
protected String getClipboardText(Clipboard clip) throws Exception {
// 获取剪切板中的内容
Transferable clipT = clip.getContents(null);
if (clipT != null) {
// 检查内容是否是文本类型
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
return (String) clipT.getTransferData(DataFlavor.stringFlavor);
}
return null;
}

public void onHotKey(int aIdentifier) {
if(aIdentifier==88)
copy();

//output("WM_HOTKEY message received " + Integer.toString(aIdentifier));
}

public void copy()
{
try {
Robot robot = new Robot();

robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);

} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void getThetext() {
try {
output(getClipboardText(this.sysc));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

当我按下 win+A的时候映射到ctrl+c来复制文本。然后程序得到文本。但是奇怪的是
在copy()函数调用之后,取得剪贴板中的string并不是当前复制的文本,而是上一次复制的文本,看起来就像是复制过程在粘贴之前。也就是说每一次都是先从剪贴板拿出,再复制。。。。。。
为什么会这样?
robot在调用 press ctrl+c之后并没有马上执行吗?

第1个回答  2011-12-05
不是很明白你说的具体内容
不过你的代码可能有问题

robot robot.keyPress(KeyEvent.VK_CONTROL);
类似这样的方法,应该有一个按下,一个释放,没看到你有释放的代码,这样就相当于你按住键没有放开,你可以试一下,在键盘上这样做的话,只有等到下一次按键,才会使上一次的按键释放掉。

另外。不知道你要复制什么文本,如果是程序的控制的话,我记都,Text,JTextArea这一类的控制都有copy方法,可以将你选择的内容放到内存的剪贴版里,不需要你自己来写实现。
第2个回答  2011-12-03
output(getClipboardText(this.sysc));
this.sysc是什么???追问

是系统的剪贴板的对象
private Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
就是这个,忘了贴上来了

追答

我想知道你是怎样调用你那些方法的。从你给出的代码里看不出你怎样调用。
另外你的代码风格很不好。

r.keypress() 是不是在函数返回的时候就马上生效?
是的

追问

这个代码从网上的拿来修改的,我知道搞的很乱了。。。
总结起来就是
利用r.keypress()操作键盘 ctrl+c 复制文本后
马上提取系统剪贴板的内容,发现是复制文本之前的内容。
但是继续重复操作会发现,之前的复制确实成功了。
比如。
第一次ctrl+c 复制“好烦啊”
显示的是:“上一次的信息”
第二次ctrl+c 复制“天气好”
显示的是:“好烦啊”
。。。
。。
这种

追答

你现在描述的还是代码执行的结果。我现在问的是你代码编写时的调用顺序。

追问

恩,首先是这个,监听全局快捷键, aIdentifier是快捷键的ID
public void onHotKey(int aIdentifier)
函数返回之后
调用 getThetext()
这两个函数是第三方的接口,是自动调用的。
另外的两个是 getClipboardText 是网上copy的
public void copy()自己写的

追答

你自己用eclipse的debug吧。

追问

本回答被提问者采纳
第3个回答  2011-12-03
把你的代码全部贴出来追问

全部很多啊,而且用到了第三方的包。。。。
这样吧,我只想知道。robot类所调用的函数
r.keypress() 是不是再函数返回的时候就马上生效?

第4个回答  2011-12-06
有个东东叫做剪贴板查看器,你的明白?
第5个回答  2011-12-24
去相关论坛发帖求助
相似回答