SWT监听全局键盘输入
我现在界面上有一个按钮点了这个按钮过后就会监听响应一个事件,shell.setVisible(false);然后我需要一个功能是,在这个shell隐藏的情况下,按键盘上的...
我现在 界面上有一个按钮 点了这个按钮过后 就会监听响应一个事件,shell.setVisible(false); 然后我需要一个功能是,在这个shell隐藏的情况下,按键盘上的F11键,可以运行shell.setVisible(true);这句话 把窗口再显示出来,我能考虑到的是用shell.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
});
用这个来写,但是好像不行,KeyListener是被加到widget上以监听用户按下键盘按键的事件。这些事件通常是在用户与允许输入文字的widget交互时发生的,也就是说类似Text和Combo。那现在窗口都隐藏了,根本就不可能有这种焦点。 展开
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
});
用这个来写,但是好像不行,KeyListener是被加到widget上以监听用户按下键盘按键的事件。这些事件通常是在用户与允许输入文字的widget交互时发生的,也就是说类似Text和Combo。那现在窗口都隐藏了,根本就不可能有这种焦点。 展开
展开全部
这个需要键盘钩子解决,SWT自带这些listener都是要组件获取焦点才有效,你的shell都最小化了,那么什么listener都不起效如果你会c++就用c++写一个键盘钩子,不会就引入swt win32 extension,里面有hook,用这个注册个键盘事件,就可以监听任何情况下的键盘事件。代码如下:
Hook.KEYBOARD.addListener(Test.this,new HookEventListener(){//@Override
public void acceptHookData(HookData arg0) {
KeyboardHookData KHD = ((KeyboardHookData)arg0);
//System.out.println( KHD.getScanCode()+"-"+KHD.getWParam()+" - "+KHD.getTransitionState()); //Print code
if( KHD.getScanCode() == 50 && KHD.getTransitionState()&&KHD.isAltPressed()){ //组合键alt+m
System.out.println("Hotting");
OS.SetActiveWindow(shell.handle);
OS.SetForegroundWindow(shell.handle);
}else if( KHD.getScanCode() == 1 ){ //按下[ESC]结束监听
System.exit(0);
}
}});
Hook.KEYBOARD.install(Test.this); //注册事件
Hook.KEYBOARD.addListener(Test.this,new HookEventListener(){//@Override
public void acceptHookData(HookData arg0) {
KeyboardHookData KHD = ((KeyboardHookData)arg0);
//System.out.println( KHD.getScanCode()+"-"+KHD.getWParam()+" - "+KHD.getTransitionState()); //Print code
if( KHD.getScanCode() == 50 && KHD.getTransitionState()&&KHD.isAltPressed()){ //组合键alt+m
System.out.println("Hotting");
OS.SetActiveWindow(shell.handle);
OS.SetForegroundWindow(shell.handle);
}else if( KHD.getScanCode() == 1 ){ //按下[ESC]结束监听
System.exit(0);
}
}});
Hook.KEYBOARD.install(Test.this); //注册事件
展开全部
你的控件掩藏后再按键虽然被掩藏的控件无法响应了,但这个按键不会消失,因此只要找出谁接收了按键,就让谁来处理就可以了
一般是获得焦点的控件会接收按键并处理,你看看是谁得到焦点了,不行可以在刚才执行shell.setVisible(false); 的地方加一句,强制让某个控件获得焦点
一般是获得焦点的控件会接收按键并处理,你看看是谁得到焦点了,不行可以在刚才执行shell.setVisible(false); 的地方加一句,强制让某个控件获得焦点
更多追问追答
追问
麻烦也稍微贴点能用的代码出来呢。。。至少让我知道用什么函数。。怎么用呢。。。
麻烦也稍微贴点能用的代码出来呢。。。至少让我知道用什么函数。。怎么用呢。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用xlib做个窗口通过printf("b2\n");
wm_hints->flags |= InputHint;
printf("b3\n");
wm_hints->input = False;
printf("b4\n");
XSetWMHints(display, parent, wm_hints);
可以达到失去焦点效果。
wm_hints->flags |= InputHint;
printf("b3\n");
wm_hints->input = False;
printf("b4\n");
XSetWMHints(display, parent, wm_hints);
可以达到失去焦点效果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询