Hallo zusammen,
ich sitze gerade an folgendem Problem:
Ich versuche den opensource-java-vnc client von ultravnc zu "verbessern".
Dieser hat bisher keine Funktionalität um z.B. eine gedrückte ALT-Taste zu übertragen (um den Fokus auf Menü zu legen).
Genau das möchte ich nun erreichen.
Ich dachte das wäre trivial, ist es aber anscheinend doch nicht.
Schaut man sich mal den Code an, findet man z.B. da sowas wie:
Drücke ich auf F1 im client geht auch das bekannte Hilfe-Fenster auf, das funktioniert also.
Kommentiere ich nun z.B. den case-Fall aus, mache einen Rebuild und verbinde mich neu zu meinem Testserver, passiert genau das was ich erwarte:
Ein F1-Druck wird nicht mehr übermittelt, sprich es passiert nix.
Dann dachte ich mir, super, das ist ja einfach und hab einfach mal folgende case-Anweisung hinzugefügt:
Tja, drücke ich aber nun im Applet "ALT" passiert gar nix.
Den keycode (hier 0xFFE9) hab ich von dieser Seite: klick
Kann mich bitte jemand mal sanft in die richtige Richtung stupsen warum das nicht so einfach geht?
Hier ist noch der komplette relevante Code-Teil, bzw. die Methode:
ich sitze gerade an folgendem Problem:
Ich versuche den opensource-java-vnc client von ultravnc zu "verbessern".
Dieser hat bisher keine Funktionalität um z.B. eine gedrückte ALT-Taste zu übertragen (um den Fokus auf Menü zu legen).
Genau das möchte ich nun erreichen.
Ich dachte das wäre trivial, ist es aber anscheinend doch nicht.
Schaut man sich mal den Code an, findet man z.B. da sowas wie:
Code:
switch (evt.getKeyCode()) {
case KeyEvent.VK_F1 :
key = 0xffbe;
break;
Drücke ich auf F1 im client geht auch das bekannte Hilfe-Fenster auf, das funktioniert also.
Kommentiere ich nun z.B. den case-Fall aus, mache einen Rebuild und verbinde mich neu zu meinem Testserver, passiert genau das was ich erwarte:
Ein F1-Druck wird nicht mehr übermittelt, sprich es passiert nix.
Dann dachte ich mir, super, das ist ja einfach und hab einfach mal folgende case-Anweisung hinzugefügt:
Code:
/*
* EDIT
*/
// catch the "ALT" key
case KeyEvent.VK_ALT :
key = 0xFFE9;
break;
Tja, drücke ich aber nun im Applet "ALT" passiert gar nix.
Den keycode (hier 0xFFE9) hab ich von dieser Seite: klick
Kann mich bitte jemand mal sanft in die richtige Richtung stupsen warum das nicht so einfach geht?
Hier ist noch der komplette relevante Code-Teil, bzw. die Methode:
Code:
//
// Write a key event message. We may need to send modifier key events
// around it to set the correct modifier state. Also we need to translate
// from the Java key values to the X keysym values used by the RFB protocol.
//
void writeKeyEvent(KeyEvent evt) throws IOException {
if (!viewer.ftp.isVisible()) {
int keyChar = evt.getKeyChar();
//
// Ignore event if only modifiers were pressed.
//
// Some JVMs return 0 instead of CHAR_UNDEFINED in getKeyChar().
if (keyChar == 0)
keyChar = KeyEvent.CHAR_UNDEFINED;
if (keyChar == KeyEvent.CHAR_UNDEFINED) {
int code = evt.getKeyCode();
if (code == KeyEvent.VK_CONTROL
|| code == KeyEvent.VK_SHIFT
|| code == KeyEvent.VK_META
|| code == KeyEvent.VK_ALT)
return;
}
//
// Key press or key release?
//
boolean down = (evt.getID() == KeyEvent.KEY_PRESSED);
int key;
if (evt.isActionKey()) {
//
// An action key should be one of the following.
// If not then just ignore the event.
//
switch (evt.getKeyCode()) {
case KeyEvent.VK_HOME :
key = 0xff50;
break;
case KeyEvent.VK_LEFT :
key = 0xff51;
break;
case KeyEvent.VK_UP :
key = 0xff52;
break;
case KeyEvent.VK_RIGHT :
key = 0xff53;
break;
case KeyEvent.VK_DOWN :
key = 0xff54;
break;
case KeyEvent.VK_PAGE_UP :
key = 0xff55;
break;
case KeyEvent.VK_PAGE_DOWN :
key = 0xff56;
break;
case KeyEvent.VK_END :
key = 0xff57;
break;
case KeyEvent.VK_INSERT :
key = 0xff63;
break;
case KeyEvent.VK_F1 :
key = 0xffbe;
break;
case KeyEvent.VK_F2 :
key = 0xffbf;
break;
case KeyEvent.VK_F3 :
key = 0xffc0;
break;
case KeyEvent.VK_F4 :
key = 0xffc1;
break;
case KeyEvent.VK_F5 :
key = 0xffc2;
break;
case KeyEvent.VK_F6 :
key = 0xffc3;
break;
case KeyEvent.VK_F7 :
key = 0xffc4;
break;
case KeyEvent.VK_F8 :
key = 0xffc5;
break;
case KeyEvent.VK_F9 :
key = 0xffc6;
break;
case KeyEvent.VK_F10 :
key = 0xffc7;
break;
case KeyEvent.VK_F11 :
key = 0xffc8;
break;
case KeyEvent.VK_F12 :
key = 0xffc9;
break;
default :
return;
}
} else {
//
// A "normal" key press. Ordinary ASCII characters go straight through.
// For CTRL-<letter>, CTRL is sent separately so just send <letter>.
// Backspace, tab, return, escape and delete have special keysyms.
// Anything else we ignore.
//
key = keyChar;
if (key < 0x20) {
if (evt.isControlDown()) {
key += 0x60;
} else {
switch (key) {
case KeyEvent.VK_BACK_SPACE :
key = 0xff08;
break;
case KeyEvent.VK_TAB :
key = 0xff09;
break;
case KeyEvent.VK_ENTER :
key = 0xff0d;
break;
case KeyEvent.VK_ESCAPE :
key = 0xff1b;
break;
}
}
} else if (key == 0x7f) {
// Delete
key = 0xffff;
} else if (key > 0xff) {
// JDK1.1 on X incorrectly passes some keysyms straight through,
// so we do too. JDK1.1.4 seems to have fixed this.
// The keysyms passed are 0xff00 .. XK_BackSpace .. XK_Delete
if ((key < 0xff00) || (key > 0xffff))
return;
}
}
// Fake keyPresses for keys that only generates keyRelease events
if ((key == 0xe5)
|| (key == 0xc5)
|| // XK_aring / XK_Aring
(key == 0xe4)
|| (key == 0xc4)
|| // XK_adiaeresis / XK_Adiaeresis
(key == 0xf6)
|| (key == 0xd6)
|| // XK_odiaeresis / XK_Odiaeresis
(key == 0xa7)
|| (key == 0xbd)
|| // XK_section / XK_onehalf
(key == 0xa3)) { // XK_sterling
// Make sure we do not send keypress events twice on platforms
// with correct JVMs (those that actually report KeyPress for all
// keys)
if (down)
brokenKeyPressed = true;
if (!down && !brokenKeyPressed) {
// We've got a release event for this key, but haven't received
// a press. Fake it.
eventBufLen = 0;
writeModifierKeyEvents(evt.getModifiers());
writeKeyEvent(key, true);
os.write(eventBuf, 0, eventBufLen);
}
if (!down)
brokenKeyPressed = false;
}
eventBufLen = 0;
writeModifierKeyEvents(evt.getModifiers());
writeKeyEvent(key, down);
// Always release all modifiers after an "up" event
if (!down)
writeModifierKeyEvents(0);
os.write(eventBuf, 0, eventBufLen);
}
}