سؤال

في الأساس ، لدي اكتشاف رئيسي لتطبيق وحدة التحكم الخاصة بي ، لسبب ما لا يكتشف مفاتيح الوظائف.

إليكم الكود الخاص بي ، أنا أستخدم برنامج التحويل البرمجي GNU على Linux. أي مساعدة أو أفكار ستقدر حقا.

        refresh();
        key = getch();
        switch(key) {
            case KEY_HOME:      key = HOME;   break;
            case KEY_END:       key = END;    break;
            case KEY_UP:        key = UP;     break;
            case KEY_DOWN:      key = DOWN;   break;
            case KEY_LEFT:      key = LEFT;   break;
            case KEY_RIGHT:     key = RIGHT;  break;
            case KEY_NPAGE:     key = PGDN;   break;
            case KEY_PPAGE:     key = PGUP;   break;
            case KEY_DC:        key = DEL;    break;
            case KEY_IC:        key = INSERT; break;
            case KEY_F(1):      key = F(1);   break;
            case KEY_F(2):      key = F(2);   break;
            case KEY_F(3):      key = F(3);   break;
            case KEY_F(4):      key = F(4);   break;
            case KEY_F(5):      key = F(5);   break;
            case KEY_F(6):      key = F(6);   break;
            case KEY_F(7):      key = F(7);   break;
            case KEY_F(8):      key = F(8);   break;
            case KEY_F(9):      key = F(9);   break;
            case KEY_F(10):     key = F(10);  break;
            case KEY_F(11):     key = F(11);  break;
            case KEY_F(12):     key = F(12);  break;
            case KEY_ENTER:     key = ENTER;  break;
            case KEY_BACKSPACE: key = BACKSPACE; break;
            default:
                //key = F(2); //For any function keypress, it jumps to default
                if (NON_ASCII(key) != 0)
                    key = UNKNOWN;
        }    
هل كانت مفيدة؟

المحلول

أنا لست خبيرًا في اللعنات ، لكن القليل من قراءة صفحات MAN التي سجلتها هذا البرنامج:

#include <curses.h>

int main()
{
    int key;

    initscr(); cbreak(); noecho();

    while (1)
    {

        key = getch();
        printw ("%u\n", key);
    }

    return 0;
}

عندما أضغط على مفتاح F ، أحصل على تسلسل 3 أحرف: 27 ، 79 ، (80 + N-1) حيث N هو عدد مفتاح F. أعتقد أن مفتاحك سيتعين على أن المفتاح هو تسلسل الهروب والتعامل معه بشكل خاص.

يحرر: هذا النمط يحمل فقط لـ F1-F4. F5 يغيرها. ربما تريد دمج وحدات الماكرو F (N) من اللعنات.

نصائح أخرى

وجود نفس القضية ، شخصيا.

إلقاء الماكرو f (n) إلى نوع char قد تم مسح القضية بطريقة سحرية بالنسبة لي ؛

cmd = getch();
    switch(cmd){
        case 'r':
            addch('r');
            break;
        case 'w':
            addch('x');
            break;
        default:
            if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
    }

وما شابه ذلك. عملت ل F2 من خلال F10 Plus F12. F's 1 و 10 و 11 "مشغولون" لعدم وجود كلمة أفضل على Xterm. (يفتح F1 نافذة المساعدة ، F11 Toggles Mode Fullscreen ، وما إلى ذلك) مرة أخرى ، لا يمكنني التأكيد بما فيه الكفاية لدرجة أنني لم أستطع البدء في تخمين سبب عمل ذلك.

قد تحتاج إلى تمكين وظيفة "لوحة المفاتيح" للمحطة باستخدام keypad وظيفة. من الصفحة اليدوية لوحة المفاتيح (3x):

int keypad(WINDOW *win, bool bf);

ال لوحة المفاتيح يمكّن الخيار لوحة المفاتيح لمحطة المستخدم. إذا تم تمكينه (BF هو صحيح) ، يمكن للمستخدم الضغط على مفتاح دالة (مثل مفتاح السهم) و wgetch إرجاع قيمة واحدة تمثل مفتاح الوظيفة ، كما في key_left. إذا تم تعطيله (BF هو خاطئة), لعنات لا يعالج مفاتيح الوظائف بشكل خاص ويتعين على البرنامج تفسير تسلسل الهروب نفسه. إذا كان يمكن تشغيل لوحة المفاتيح الموجودة في المحطة (مصنوعة لإرسالها) وإيقافها (تم إجراؤها إلى العمل محليًا) ، فإن تشغيل هذا الخيار يؤدي إلى تشغيل لوحة المفاتيح الطرفية متى wgetch يسمى. القيمة الافتراضية لفنة لوحة المفاتيح خاطئة.

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