كيفية استخدام مفاتيح معدل متعددة في C #
-
07-07-2019 - |
سؤال
وأنا باستخدام الحدث 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 = صحيح يجب وقف ذلك، على الرغم من أنني لا أعرف اليات محددة وراء ذلك.