كيف يمكنك تحديد ما إذا كانت الشخصية تتطلب مفتاح SHIFT لتكون مكتوبة؟

StackOverflow https://stackoverflow.com/questions/1101625

  •  12-09-2019
  •  | 
  •  

سؤال

أكتب بعض التعليمات البرمجية لكتابة سلاسل باستخدام فئة الروبوت. كل شيء جيد في الغالب (حسنا، لا بد لي من استخدام عبارة تبديل كبيرة للحصول على Keycodes الأحرف)، باستثناء بعض المفاتيح ليس لديها keycodes، لأنها هي في الواقع مزيج من يحول + بعض المفتاح الآخر. للحصول على أحرف الحالة العليا، من السهل التحقق، باستخدام Character.isUpperCase(c), ، ولكن لجميع الرموز مثل !@#$%^&*()_+ ولم يعتبر علامات الترقيم المختلفة "الحالة العليا" على الرغم من أنهم يتطلبون الضغط المراد ضغطهم من أجل توليد ضغط المفاتيح. حاولت googling لذلك، لكن لم أجد منشورا منتدى بدون إجابات مرضية. هل هناك أي طريقة لتحديد ما إذا كانت هناك حاجة إلى تحتاج الأحرف تتحول إلى الضغط، وإذا كان الأمر كذلك، فما هي الحرف هي النسخة "غير المنظمة"؟

تحرير: هنا هو الرمز الذي لدي حتى الآن.

public void GenerateKeyTyped(char c) {
    if (Character.isUpperCase(c)) {
        r.keyPress(KeyEvent.VK_SHIFT);
    }
    r.keyPress(GetKeyCode(c));
    r.keyRelease(GetKeyCode(c));
    if (Character.isUpperCase(c)) {
        r.keyRelease(KeyEvent.VK_SHIFT);
    }
}
هل كانت مفيدة؟

المحلول

لا أعرف طريقة لحل مشكلتك مباشرة (لقد انتهى الأمر فقط باستخدام خريطة لهذه الأحرف) ولكن قد تعطيك بعض الأفكار:

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Main3 {

    public static void main(String[] args) {
        try {
            Robot robot = new Robot();

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("!", "1");
            map.put("@", "2");
            map.put("#", "3");

            char[] charz = "abcdefgABCDEFG123!#".toCharArray();

            for(int i = 0; i < charz.length; i++)
            {
                System.out.print(charz[i] + " : ");
                boolean shiftRequired = false;
                String key = String.valueOf(charz[i]);
                String value = map.get(key);

                if (value != null)
                {
                    shiftRequired = true;
                    key = value;
                }
                else if (Character.isUpperCase(key.charAt(0)))
                {
                    shiftRequired = true;
                }
                else
                {
                    key = key.toUpperCase();
                }

                KeyStroke ks = KeyStroke.getKeyStroke("pressed " + key.toUpperCase());

                int keyCode = ks.getKeyCode();
                System.out.println(keyCode);

                if (shiftRequired)
                    robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT);

                robot.keyPress( keyCode );
                robot.keyRelease( keyCode );

                if (shiftRequired)
                    robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT);
            }


        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

نصائح أخرى

لست متأكدا إذا كان ما تبحث عنه ممكن. يمكنك إنشاء الجدول الخاص بك، ولكن ضع في اعتبارك أنه سيعمل بعد ذلك من أجل تخطيط لوحة مفاتيح واحد فقط (تحتوي العديد من اللغات على تخطيطات لوحة المفاتيح الخاصة بها أكثر ملاءمة لمجموعات الأحرف الخاصة بها، أيضا، هناك تخطيط DVorak الذي ربما يكون عليه تحولت الحركة الخاصة مقابل مفاتيح Unnshifted) ما لم تأخذ في الاعتبار جميع تخطيطات لوحة المفاتيح التي تريد دعمها، وإنشاء جداول مخصصة لأولئك.

هل يمكنك استخدام فصول AWT؟ شيء مثل هذا قد يعمل:

AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!');
int modifers = ks.getModifiers();

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
    // Shift pressed
}

إذا نظرت إلى طاولة ASCII توجد مفاتيح الرمز هذه في النطاق 0x21 - 0x2B
ربما يمكنك إلقاء نظرة على جدول ASCII للتعرف على جميع رموزك الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top