JAVA点击按钮后,键盘监听失效。不论按钮是否有监听。经过如图的小程序测试,结果确实就是这样。使用

JAVA点击按钮后,键盘监听失效。不论按钮是否有监听。经过如图的小程序测试,结果确实就是这样。使用,第1张

试试把addKeyxxxxxx替换成

jb.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

System.out.println("按钮被点击")

}

})

看下来应该是键盘“先要进入某个可输入文字的组件中”,通常点击窗口后 JFrame 会尝试把键盘焦点恢复到之前焦点从这个 JFrame 窗体离开时当时焦点所在的那个组件上,如果当时没有输入组件接收焦点的话,就会自动重新计算第一个可接收输入焦点的组件。然后之后的键盘事件就会自动发送到这个输入组件上了。因此,当只是激活当前窗体的 JFrame 比如鼠标点了标题栏而不是在 JFrame 的 Content Pane 的区域内,那么输入焦点并不会自动恢复。我们需要在 JFrame 的 Content Pane 中点击一次。

要了解一点,Windows 编程中图形组件有两种,一种是 Window 窗体(包括 JFrame, JDialog, Frame, Dialog) 它们是直接与 Windows *** 作系统打交道的,它的标题栏实际上与 *** 作系统直接相关,比如最大化最小化后被当前窗体遮挡的应用程序窗体需要重画,第二种是 JPanel, JTextField 之类的 Window 内的组件。

焦点点击在 Window 窗体型组件时有额外的事情需要做的。

其实不用Hook,也不用模块,检查系统闲置时间已有专用函数,不必这么复杂。

完整代码如下:

Option Explicit

Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Type LASTINPUTINFO

cbSize As Long

dwTime As Long

End Type

Dim lii As LASTINPUTINFO

Private Sub Form_Load()

Timer1.Interval = 1000

lii.cbSize = Len(lii)

End Sub

Private Sub Timer1_Timer()

If GetLastInputInfo(lii) Then

If (GetTickCount - lii.dwTime) / 60000 >= 15 Then

Shell "shutdown.exe -s -t 180"

Call MsgBox("由于本机15分钟没有 *** 作,如果3分钟后没有反应,系统将强制关机", vbYesNo + vbExclamation + vbDefaultButton2, "提示")

End If

End If

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12083429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存