eSWT: display.post() verschluckt "special characters" (alphanumerisch)
sYbb 17.11.2009 - 08:06 2858 17
sYbb
OC Addicted
|
was ich jetzt noch probiert hab is die ALT-kombination und den keypad-tasten, das wäre genau das, was ich brauche,... leider geht das bei windows CE bzw. dem ding offenbar net, da die ALT-taste sofort wieder "rausspringt", sobald ich die erste taste gedrückt habe... um also einen bindestrich (keyCode: 45) darzustellen bräuchte ich ALT - 4 - 5, und beim vierer is schon vorbei...
such grad danach, ob das eine eigenheit des OS oder des geräts is
|
that
ModeratorHoffnungsloser Optimist
|
mit 0xF0 habe ich mir erhofft, dass er mir den modus einfach zu alphanumerisch ändert ("Changes the mode to alphanumeric.")
...
mit E7 (unicode characters) funktioniert es ebenfalls nicht: Das ist klar, weil das erste ist nur "For East Asian Input Method Editors (IMEs)" und das zweite geht nur im Fall "If VK_PACKET is used with SendInput, then the Unicode character to be delivered should be placed into the lower 16 bits of the scan code.", was dein Code offenbar nicht aufruft. windows xp beispielsweise, wo ich dasselbe beispiel probiert hab, postet den bindestrich ohne weiteres handling, als ganz normales zeichen (den code dazu kann i auch gern posten). hier gibt es also offenbar andere virtual key-codes als bei winCE, was ja logisch ist. Die VK-Codes sind eigentlich gleich. Kanns sein, dass eSWT für Desktop-Windows und Windows CE unterschiedlich implementiert ist? was noch interessant ist: laut dem source im CVS wird das property event.character ignoriert; funktionieren tut es allerdings aber auch damit und also auch so, wie es javadoc sagt: entweder, man setzt den character oder den keyCode, beides funktioniert Das ist allerdings tatsächlich seltsam. Wenn das wirklich geht, schauen wir uns den falschen Code an. Hast du das unter CE ausprobiert oder unter XP? In diesem Fall ist die Implementierung wahrscheinlich tatsächlich anders. IMHO ist hier die beste Vorgehensweise ein Bottom-Up-Ansatz: Versuche, das Ganze mal direkt in C/C++ zu machen, und wenns dann klappt, kümmere dich um die Java-Schicht darüber.
|
sYbb
OC Addicted
|
Das ist klar, weil das erste ist nur "For East Asian Input Method Editors (IMEs)" und das zweite geht... ja, mein code ruft das nicht auf, würde auch keinen sinn machen => die sendInput-methode ist laut msdn für winCE so und so nicht verfügbar, die dafür verwendete user32.dll gibt es erst in höheren versionen. zusätzlich hab ich nur die möglichkeit, im java was zu ändern (zumindest jetzt, kurzfristig), was auch deinen bottom-up-ansatz für jetzt mal in den wind schießt. Die VK-Codes sind eigentlich gleich. Kanns sein, dass eSWT für Desktop-Windows und Windows CE unterschiedlich implementiert ist? die java implementierung sollte dieselbe sein; die nativen libraries sind anders (unterscheiden sich zumindest wesentlich in der file-größe). dennoch hab ich im eSWT source (CVS) nur eine einzige Display.c gefunden, die die besprochene methode "Display_PostKeyEvent" enthält, und diese ignoriert den character und bearbeitet ihn in keinster weise weiter, trotzdem funktioniert es. probiert hab ich das nur auf winCE, mit folgendem source haut aber zumindest das posten von bindestrihcen unter XP im eclipse hin: public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
final Text text = new Text(shell, SWT.BORDER);
text.setSize(text.computeSize(150, SWT.DEFAULT));
shell.pack();
shell.open();
new Thread() {
public void run() {
final String string = "!\"#$%&'()*+-./:;<=>?@[]\\^_~|{}`,";
// String string = "[][][][][][]----[][][][][][]";
// String string = "------";
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
boolean shift = Character.isUpperCase(ch);
ch = Character.toLowerCase(ch);
if (shift) {
Event event = new Event();
event.type = SWT.KeyDown;
event.keyCode = SWT.SHIFT;
display.post(event);
}
Event event = new Event();
event.type = SWT.KeyDown;
event.character = ch;
display.post(event);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
event.type = SWT.KeyUp;
display.post(event);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
if (shift) {
event = new Event();
event.type = SWT.KeyUp;
event.keyCode = SWT.SHIFT;
display.post(event);
}
}
}
}.start();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
hier werden die bindestriche auch nicht gesondert behandelt, und werden dennoch angezeigt. ich verwende in beiden fällen - für eclipse im XP und nativ auf dem winCE dings - die neuesten sourcen von eSWT. das würde irgendwie heißen, dass die keyCodes anders sein müssen, da es ja im winCE nicht angezeigt wird, im winXP schon. oder hab ich das falsch verstanden? => diese virtual keyCodes sind ja glaub ich plattform spezifisch, sonst würde oben net immer der hint "Platform Builder for Microsoft Windows CE 5.0" stehen, oder? wenn du dir diese virtual key code tabelle so ansiehst ( http://msdn.microsoft.com/en-us/library/ms927178.aspx), was würdest du dann hier im java-code setzen? ich bin jetzt schno so weit, meine panels aufzubohren und den input ohne SWT und direkt einzusetzen...
|