سؤال

أنا جديد في C# و أنا أقوم ببعض الأعمال في القائمة تطبيق.لدي دايركت العرض يحتوي على مكونات في ذلك أن كنت تريد أن تكون قادرة على الموقف باستخدام مفاتيح الأسهم.

حاليا أنا المهيمن ProcessCmdKey واصطياد السهم المدخلات إرسال رسالة OnKeyPress الحدث.يعمل هذا, ولكن أريد أن تكون قادرة على استخدام المعدلات(ALT+CTRL+التحول).في أقرب وقت كما أنا عقد التعديل واضغط السهم لا يتم تشغيل الأحداث التي أنا الاستماع إلى.

هل من أحد لديه أي أفكار أو اقتراحات حول أين يجب أن أذهب مع هذا ؟

هل كانت مفيدة؟

المحلول

داخل تجاوز ProcessCmdKey كيف يمكنك تحديد أي مفتاح الضغط?

قيمة keyData (المعلمة الثانية) سوف تتغير تعتمد على مفتاح الضغط على أي مفاتيح التعديل ، وذلك ، على سبيل المثال ، يؤدي الضغط على السهم الأيسر سيعود رمز 37 shift اليسار سيعود 65573 ctrl الأيسر 131109 و alt الأيسر 262181.

يمكنك استخراج المعدلات ومفتاح الضغط من قبل اندينج المناسبة التعداد القيم:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shiftPressed = (keyData & Keys.Shift) != 0;
    Keys unmodifiedKey = (keyData & Keys.KeyCode);

    // rest of code goes here
}

نصائح أخرى

أنا upvoted Tokabi الجواب, ولكن بمقارنة مفاتيح هناك بعض نصيحة إضافية على StackOverflow.com هنا.هنا هي بعض المهام التي لا تستخدم للمساعدة على تبسيط كل شيء.

   public Keys UnmodifiedKey(Keys key)
    {
        return key & Keys.KeyCode;
    }

    public bool KeyPressed(Keys key, Keys test)
    {
        return UnmodifiedKey(key) == test;
    }

    public bool ModifierKeyPressed(Keys key, Keys test)
    {
        return (key & test) == test;
    }

    public bool ControlPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Control);
    }

    public bool AltPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Alt);
    }

    public bool ShiftPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Shift);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData))
        {
            int n = code.Text.IndexOfPrev('<', code.SelectionStart);
            if (n < 0) return false;
            if (ShiftPressed(keyData))
            {
                code.ExpandSelectionLeftTo(n);
            }
            else
            {
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData))
        {
            if (ShiftPressed(keyData))
            {
                int n = code.Text.IndexOf('>', code.SelectionEnd() + 1);
                if (n < 0) return false;
                code.ExpandSelectionRightTo(n + 1);
            }
            else
            {
                int n = code.Text.IndexOf('<', code.SelectionStart + 1);
                if (n < 0) return false;
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top