📄 input.java
字号:
lastKeyEvent = e;
modifiersValid = true;
long time = getTime();
logger.debug("RELEASED keychar='" + e.getKeyChar() + "' keycode=0x"
+ Integer.toHexString(e.getKeyCode()) + " char='"
+ ((char) e.getKeyCode()) + "'");
if (rdp != null) {
if (!handleSpecialKeys(time, e, false))
sendKeyPresses(newKeyMapper.getKeyStrokes(e));
// sendScancode(time, RDP_KEYRELEASE, keys.getScancode(e));
}
}
}
/**
* Act on any keyboard shortcuts that a specified KeyEvent may describe
* @param time Time stamp for event to send to server
* @param e Keyboard event to be checked for shortcut keys
* @param pressed True if key was pressed, false if released
* @return True if a shortcut key combination was detected and acted upon, false otherwise
*/
public boolean handleShortcutKeys(long time, KeyEvent e, boolean pressed) {
if(!e.isAltDown()) return false;
if (!altDown) return false; // all of the below have ALT on
switch (e.getKeyCode()) {
/* case KeyEvent.VK_M:
if(pressed) ((RdesktopFrame_Localised) canvas.getParent()).toggleMenu();
break; */
case KeyEvent.VK_ENTER:
sendScancode(time, RDP_KEYRELEASE, 0x38);
altDown = false;
((RdesktopFrame_Localised) canvas.getParent()).toggleFullScreen();
break;
/*
* The below case block handles "real" ALT+TAB events. Once the TAB in
* an ALT+TAB combination has been pressed, the TAB is sent to the
* server with the quiet flag on, as is the subsequent ALT-up.
*
* This ensures that the initial ALT press is "undone" by the server.
*
* --- Tom Elliott, 7/04/05
*/
case KeyEvent.VK_TAB: // Alt+Tab received, quiet combination
sendScancode(time, (pressed ? RDP_KEYPRESS : RDP_KEYRELEASE)
| KBD_FLAG_QUIET, 0x0f);
if (!pressed) {
sendScancode(time, RDP_KEYRELEASE | KBD_FLAG_QUIET, 0x38); // Release
// Alt
}
if (pressed)
logger.debug("Alt + Tab pressed, ignoring, releasing tab");
break;
case KeyEvent.VK_PAGE_UP: // Alt + PgUp = Alt-Tab
sendScancode(time, pressed ? RDP_KEYPRESS : RDP_KEYRELEASE, 0x0f); // TAB
if (pressed)
logger.debug("shortcut pressed: sent ALT+TAB");
break;
case KeyEvent.VK_PAGE_DOWN: // Alt + PgDown = Alt-Shift-Tab
if (pressed) {
sendScancode(time, RDP_KEYPRESS, 0x2a); // Shift
sendScancode(time, RDP_KEYPRESS, 0x0f); // TAB
logger.debug("shortcut pressed: sent ALT+SHIFT+TAB");
} else {
sendScancode(time, RDP_KEYRELEASE, 0x0f); // TAB
sendScancode(time, RDP_KEYRELEASE, 0x2a); // Shift
}
break;
case KeyEvent.VK_INSERT: // Alt + Insert = Alt + Esc
sendScancode(time, pressed ? RDP_KEYPRESS : RDP_KEYRELEASE, 0x01); // ESC
if (pressed)
logger.debug("shortcut pressed: sent ALT+ESC");
break;
case KeyEvent.VK_HOME: // Alt + Home = Ctrl + Esc (Start)
if (pressed) {
sendScancode(time, RDP_KEYRELEASE, 0x38); // ALT
sendScancode(time, RDP_KEYPRESS, 0x1d); // left Ctrl
sendScancode(time, RDP_KEYPRESS, 0x01); // Esc
logger.debug("shortcut pressed: sent CTRL+ESC (Start)");
} else {
sendScancode(time, RDP_KEYRELEASE, 0x01); // escape
sendScancode(time, RDP_KEYRELEASE, 0x1d); // left ctrl
// sendScancode(time,RDP_KEYPRESS,0x38); // ALT
}
break;
case KeyEvent.VK_END: // Ctrl+Alt+End = Ctrl+Alt+Del
if (ctrlDown) {
sendScancode(time, pressed ? RDP_KEYPRESS : RDP_KEYRELEASE,
0x53 | KeyCode.SCANCODE_EXTENDED); // DEL
if (pressed)
logger.debug("shortcut pressed: sent CTRL+ALT+DEL");
}
break;
case KeyEvent.VK_DELETE: // Alt + Delete = Menu
if (pressed) {
sendScancode(time, RDP_KEYRELEASE, 0x38); // ALT
// need to do another press and release to shift focus from
// to/from menu bar
sendScancode(time, RDP_KEYPRESS, 0x38); // ALT
sendScancode(time, RDP_KEYRELEASE, 0x38); // ALT
sendScancode(time, RDP_KEYPRESS,
0x5d | KeyCode.SCANCODE_EXTENDED); // Menu
logger.debug("shortcut pressed: sent MENU");
} else {
sendScancode(time, RDP_KEYRELEASE,
0x5d | KeyCode.SCANCODE_EXTENDED); // Menu
// sendScancode(time,RDP_KEYPRESS,0x38); // ALT
}
break;
case KeyEvent.VK_SUBTRACT: // Ctrl + Alt + Minus (on NUM KEYPAD) =
// Alt+PrtSc
if (ctrlDown) {
if (pressed) {
sendScancode(time, RDP_KEYRELEASE, 0x1d); // Ctrl
sendScancode(time, RDP_KEYPRESS,
0x37 | KeyCode.SCANCODE_EXTENDED); // PrtSc
logger.debug("shortcut pressed: sent ALT+PRTSC");
} else {
sendScancode(time, RDP_KEYRELEASE,
0x37 | KeyCode.SCANCODE_EXTENDED); // PrtSc
sendScancode(time, RDP_KEYPRESS, 0x1d); // Ctrl
}
}
break;
case KeyEvent.VK_ADD: // Ctrl + ALt + Plus (on NUM KEYPAD) = PrtSc
case KeyEvent.VK_EQUALS: // for laptops that can't do Ctrl-Alt+Plus
if (ctrlDown) {
if (pressed) {
sendScancode(time, RDP_KEYRELEASE, 0x38); // Alt
sendScancode(time, RDP_KEYRELEASE, 0x1d); // Ctrl
sendScancode(time, RDP_KEYPRESS,
0x37 | KeyCode.SCANCODE_EXTENDED); // PrtSc
logger.debug("shortcut pressed: sent PRTSC");
} else {
sendScancode(time, RDP_KEYRELEASE,
0x37 | KeyCode.SCANCODE_EXTENDED); // PrtSc
sendScancode(time, RDP_KEYPRESS, 0x1d); // Ctrl
sendScancode(time, RDP_KEYPRESS, 0x38); // Alt
}
}
break;
default:
return false;
}
return true;
}
/**
* Deal with modifier keys as control, alt or caps lock
* @param time Time stamp for key event
* @param e Key event to check for special keys
* @param pressed True if key was pressed, false if released
* @return
*/
public boolean handleSpecialKeys(long time, KeyEvent e, boolean pressed) {
if (handleShortcutKeys(time, e, pressed))
return true;
switch (e.getKeyCode()) {
case KeyEvent.VK_CONTROL:
ctrlDown = pressed;
return false;
case KeyEvent.VK_ALT:
altDown = pressed;
return false;
case KeyEvent.VK_CAPS_LOCK:
if (pressed && Options.caps_sends_up_and_down)
capsLockOn = !capsLockOn;
if (!Options.caps_sends_up_and_down) {
if (pressed)
capsLockOn = true;
else
capsLockOn = false;
}
return false;
case KeyEvent.VK_NUM_LOCK:
if (pressed)
numLockOn = !numLockOn;
return false;
case KeyEvent.VK_SCROLL_LOCK:
if (pressed)
scrollLockOn = !scrollLockOn;
return false;
case KeyEvent.VK_PAUSE: // untested
if (pressed) { // E1 1D 45 E1 9D C5
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0xe1, 0);
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0x1d, 0);
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0x45, 0);
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0xe1, 0);
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0x9d, 0);
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,
0xc5, 0);
} else { // release left ctrl
rdp.sendInput((int) time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE,
0x1d, 0);
}
break;
// Removed, as java on MacOS send the option key as VK_META
/*
* case KeyEvent.VK_META: // Windows key logger.debug("Windows key
* received"); if(pressed){ sendScancode(time, RDP_KEYPRESS, 0x1d); //
* left ctrl sendScancode(time, RDP_KEYPRESS, 0x01); // escape } else{
* sendScancode(time, RDP_KEYRELEASE, 0x01); // escape
* sendScancode(time, RDP_KEYRELEASE, 0x1d); // left ctrl } break;
*/
// haven't found a way to detect BREAK key in java - VK_BREAK doesn't
// exist
/*
* case KeyEvent.VK_BREAK: if(pressed){
* sendScancode(time,RDP_KEYPRESS,(KeyCode.SCANCODE_EXTENDED | 0x46));
* sendScancode(time,RDP_KEYPRESS,(KeyCode.SCANCODE_EXTENDED | 0xc6)); } //
* do nothing on release break;
*/
default:
return false; // not handled - use sendScancode instead
}
return true; // handled - no need to use sendScancode
}
/**
* Turn off any locking key, check states if available
*/
public void triggerReadyToSend() {
capsLockOn = false;
numLockOn = false;
scrollLockOn = false;
doLockKeys(); // ensure lock key states are correct
}
protected void doLockKeys() {
}
/**
* Handle pressing of the middle mouse button, sending relevent event data to the server
* @param e MouseEvent detailing circumstances under which middle button was pressed
*/
protected void middleButtonPressed(MouseEvent e) {
/*
* if (Options.paste_hack && ctrlDown){ try{ canvas.setBusyCursor();
* }catch (RdesktopException ex){ logger.warn(ex.getMessage()); } if
* (capsLockOn){ logger.debug("Turning caps lock off for paste"); //
* turn caps lock off sendScancode(getTime(), RDP_KEYPRESS, 0x3a); //
* caps lock sendScancode(getTime(), RDP_KEYRELEASE, 0x3a); // caps lock }
* paste(); if (capsLockOn){ // turn caps lock back on
* logger.debug("Turning caps lock back on after paste");
* sendScancode(getTime(), RDP_KEYPRESS, 0x3a); // caps lock
* sendScancode(getTime(), RDP_KEYRELEASE, 0x3a); // caps lock }
* canvas.unsetBusyCursor(); } else
*/
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON3
| MOUSE_FLAG_DOWN, e.getX(), e.getY());
}
/**
* Handle release of the middle mouse button, sending relevent event data to the server
* @param e MouseEvent detailing circumstances under which middle button was released
*/
protected void middleButtonReleased(MouseEvent e) {
/* if (!Options.paste_hack || !ctrlDown) */
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON3, e.getX(), e
.getY());
}
class RdesktopMouseAdapter extends MouseAdapter {
public RdesktopMouseAdapter() {
super();
}
public void mousePressed(MouseEvent e) {
if(e.getY() != 0) ((RdesktopFrame_Localised) canvas.getParent()).hideMenu();
int time = getTime();
if (rdp != null) {
if ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
logger.debug("Mouse Button 1 Pressed.");
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1
| MOUSE_FLAG_DOWN, e.getX(), e.getY());
} else if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
logger.debug("Mouse Button 3 Pressed.");
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2
| MOUSE_FLAG_DOWN, e.getX(), e.getY());
} else if ((e.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK) {
logger.debug("Middle Mouse Button Pressed.");
middleButtonPressed(e);
}
}
}
public void mouseReleased(MouseEvent e) {
int time = getTime();
if (rdp != null) {
if ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON1, e
.getX(), e.getY());
} else if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_BUTTON2, e
.getX(), e.getY());
} else if ((e.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK) {
middleButtonReleased(e);
}
}
}
}
class RdesktopMouseMotionAdapter extends MouseMotionAdapter {
public RdesktopMouseMotionAdapter() {
super();
}
public void mouseMoved(MouseEvent e) {
int time = getTime();
// Code to limit mouse events to 4 per second. Doesn't seem to affect performance
// long mTime = System.currentTimeMillis();
// if((mTime - Input.last_mousemove) < 250) return;
//Input.last_mousemove = mTime;
// if(logger.isInfoEnabled()) logger.info("mouseMoved to
// "+e.getX()+", "+e.getY()+" at "+time);
// TODO: complete menu show/hide section
if(e.getY() == 0) ((RdesktopFrame_Localised) canvas.getParent()).showMenu();
//else ((RdesktopFrame_Localised) canvas.getParent()).hideMenu();
if (rdp != null) {
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, e.getX(),
e.getY());
}
}
public void mouseDragged(MouseEvent e) {
int time = getTime();
// if(logger.isInfoEnabled()) logger.info("mouseMoved to
// "+e.getX()+", "+e.getY()+" at "+time);
if (rdp != null) {
rdp.sendInput(time, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, e.getX(),
e.getY());
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -