자바로 OSK (On-Screen Keyboard)를 작성했습니다. 이것은 장애가있는 사람들을위한 것이며 표준 키보드가 할 수있는 모든 것을 할 수 있어야합니다. 내가 작동하지 않는 것으로 알아챈 한 가지는 컨텍스트 메뉴 - (대부분의) Windows 프로그램입니다. 내 OSK 사용자가 '컨텍스트 메뉴'키 (일반적으로 표준 키보드의 오른쪽 Ctrl 옆)를 클릭하고 화살표 키를 사용하여 해당 메뉴를 탐색 할 수있게하려고합니다. 컨텍스트 메뉴가 잘 나타나지만 화살표 키를 누르기 위해 프레임을 다시 클릭하면 컨텍스트 메뉴가 사라집니다.Java 로봇 및 스윙 버튼을 사용하여 다른 (Windows) 응용 프로그램의 컨텍스트 메뉴를 제어하는 방법
누구나 달성 할 수있는 방법에 대해 아이디어를 얻었습니까? (아마도 상당히 괴물 같은 '해킹'이 필요했을 것입니다)? 마우스 클릭이 화면의 다른 곳에서 발생하기 때문에 컨텍스트가 사라지는 것을 확신합니다. 실제로 뭔가를 클릭해야 할 때 주위를 둘러보기가 어렵습니다.
아래는 테스트 앱입니다. NetBeans의 컨텍스트 메뉴를 탐색하는 데 사용할 수는 있지만 시도한 다른 응용 프로그램 (예 : Windows 탐색기)에서는 탐색 할 수 없습니다.
마지막으로import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class RobotContextMenuTest extends JFrame implements ActionListener
{
Robot R;
JPanel JP;
JButton JBmenu, JBdown;
public RobotContextMenuTest()
{
try
{
R = new Robot();
}
catch(Exception e)
{
e.printStackTrace();
}
JP = new JPanel();
getContentPane().add(JP);
JBmenu = new JButton("Menu");
JBmenu.addActionListener(this);
JP.add(JBmenu);
JBdown = new JButton("Down");
JBdown.addActionListener(this);
JP.add(JBdown);
setFocusableWindowState(false);
setAlwaysOnTop(true);
setSize(200,80);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[])
{
new RobotContextMenuTest();
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("Menu"))
{
R.keyPress(KeyEvent.VK_CONTEXT_MENU);
R.keyRelease(KeyEvent.VK_CONTEXT_MENU);
}
else if(e.getActionCommand().equals("Down"))
{
R.keyPress(KeyEvent.VK_DOWN);
R.keyRelease(KeyEvent.VK_DOWN);
}
}
}
, 여기에 내가 무엇을 시도했다입니다 : 대신의 ActionListener의 버튼의 MouseListener를 사용
- , 다음 다른 응용 프로그램을 등록하지 않을 것이라는 희망으로 된 MouseEvent를 '소모' 컨텍스트 메뉴를 숨 깁니다.
- 나는 모든 상황에 맞는 메뉴를 보여줄 수있는 스레드 테스트 응용 프로그램을 만들었고 자동으로 그것을 (1 초에 한 번) 검사 할 수는 있지만 실제로 문제를 해결하지는 못합니다! 컨텍스트 메뉴 탐색을 사용자의 마우스 클릭으로 제어하려고합니다.
- 나는 마우스 클릭을 캡쳐하는 다른 방법으로 JNativeHook을 사용해 보았지만 결과는 같습니다.
오랜 질문에 대해 유감이지만 상당히 복잡한 문제입니다! 덧붙여 말하면, 표준 Windows 7 OSK는 이것을 할 수 없지만 WiViK 수 있습니다. 감사. 대신의 ActionListener의 버튼의 MouseListener를 사용
낮은 레벨에서 마우스 버튼 이벤트를 억제/종료 할 수있는 방법이 있습니까? - MouseEvent.consume()과 비슷하지만 글로벌 수준입니까? JNativeHook에서 이와 같은 작업을 수행합니까? 아마도 마우스 클릭이 상황에 맞는 메뉴를 닫지 못하게 할 수 있습니다 (그러나 위의 예에서 내리기 버튼을 누르는 것). –