سؤال

وأنا باستخدام الحدث KeyDown للكشف عن مفاتيح الضغط ولها عدة مجموعات رئيسية لعمليات مختلفة.

if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control && e.Modifiers == Keys.Shift)
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}

لسبب تركيبة المفاتيح التي أنا ضربت السيطرة + التحول + C لا يعمل. لقد إعادة أمرهم، ووضعها في أعلى التفكير قد يكون التدخل من السيطرة + C ، وحتى إزالة السيطرة + C لمعرفة ما إذا كان يسبب مشكلة. انه ما زال لا يعمل. وأنا أعلم أنه ربما شيء بسيط جدا، ولكن لا يمكن فهم تماما ما هو عليه. كل من بلدي 1 معدل + 1 مفتاح تعمل بشكل جيد الجمع، وبمجرد أن إضافة التعديل الثاني هو عندما لم يعد يعمل.

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

المحلول

if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}

نصائح أخرى

هل حاولت e.Modifiers == (Keys.Control | Keys.Shift)؟

إذا كنت ترغب في السماح السيطرة و التحول ثم استخدام أحادي المعامل OR (كما Keys هو التعداد Flags)

if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work (if Ctrl-Shift-C is pressed, but not if Alt is pressed as well)
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste (if Ctrl is only modifier pressed)
}

وهذا سوف تفشل إذا البديل الضغط وكذلك

وهناك طريقة أخرى تتمثل في إضافة عنصر القائمة غير مرئي، تعيين السيطرة + التحول + C الاختصار إليها، والتعامل مع الحدث هناك.

      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();

وهذا هو ما فعلته ل السيطرة + Z تراجع و السيطرة + التحول + Z إعادة تشغيل وأنه يعمل.

  Private Sub Form_Main_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
      Case Keys.Add
        diagramView.ZoomIn()
      Case Keys.Subtract
        diagramView.ZoomOut()
      Case Keys.Z
        If e.Modifiers = Keys.Control + Keys.Shift Then
          diagram.UndoManager.Redo()
        ElseIf e.Modifiers = Keys.Control Then
          diagram.UndoManager.Undo()
        End If
    End Select
  End Sub

وجرب هذا. يجب أن تتصرف بالطريقة التي ترغب فيها، وانها أسهل قليلا.

 if (e.Control)
 {
    if (e.Shift && e.KeyCode == Keys.C)
    {
       //Do work
    }
    else if (e.KeyCode == Keys.V)
    {
       //Paste
    }
 }

وكما نرى لا أحد يذكر منهم، أنا مجرد الذهاب الى مغادرة اقتراح لاستخدام KeyEventArgs.KeyData:

if (e.KeyData == (Keys.C | Keys.Control | Keys.Shift)
{
  //do stuff
  //potentially use e.Handled = true
}
if (e.KeyData == (Keys.V | Keys.Control)
{
  //do other stuff
  //potentially use e.Handled = true
}

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

وe.Handled = صحيح يجب وقف ذلك، على الرغم من أنني لا أعرف اليات محددة وراء ذلك.

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