4

我正在编写一个程序,并且在我的程序中,我希望在我的程序没有焦点时观看键盘。我使用一个名为“JNativeHook”的罐子,可以在这里找到http://code.google.com/p/jnativehook/

关于我的问题:这个 jar 可以工作并捕获每个按键和释放事件。在我的代码中,我跟踪这些,在每个按键事件中,如果按下“v”或 ctrl 键,我为每个按键设置一个标志,如果两者都为真,则用户正在粘贴。当用户最初粘贴时,程序将计数器递增到 1。在下一次粘贴时,如果计数器为 1,它将系统剪贴板的文本设置为“Test Paste1”,递增计数器,它执行 3 次,第三次取模计数器 3 并重新启动。(我计划添加控制,以便如果按下某个组合,keyListener 处于活动状态并尝试更改系统剪贴板;再次按下它会关闭它)

我的问题是,有时它确实修改了剪贴板,我实际上粘贴了正确的文本,有时它没有,我得到一个错误

Exception in thread "pool-1-thread-135" java.lang.IllegalStateException: cannot open system clipboard

所以有时我可以打开键盘,有时不能。我正在使用记事本进行测试。所以我运行我的程序,打开记事本,复制一些东西。然后我粘贴,它说,然后下一次粘贴有时正确有时不正确,下一次(第二次粘贴),下一次(第三次)。然后,如果我一直坚持下去,它就会重新开始。

为什么有时我无法访问剪贴板,我怎么能这样写才能保证文本到达剪贴板?

我想把这条线放在一个while循环中,而没有异常继续。但是,如果剪贴板在 x 时间内“无法访问”,我可能会陷入无限循环。

继续:

http://stackoverflow.com/questions/14492472/cannot-gain-control-over-clipboard-even-with-controlling-logic
4

1 回答 1

0

其他一些程序打开了剪贴板,您正在使用的代码会引发异常来指示这一点。

所以,一开始,如果你等待太久,你似乎不得不忙着等待并放弃。但是,有一种可能的解决方法,将您的程序设置为剪贴板的所有者,并在您失去它时重新获得所有权(因为剪贴板的所有者在失去所有权时会收到通知)。

阅读此处的线程以获得可能的解决方案:http: //www.coderanch.com/t/377833/java/java/listen-clipboard

于 2013-01-23T22:36:06.640 回答