มีการสร้างทั่วโลกที่ฉันสามารถใช้เมื่อใดก็ตามที่ฉันต้องการเข้าถึงไม่ว่าจะเป็นปุ่มควบคุม, Shift, Alt หรือไม่ ยกตัวอย่างเช่นภายในกรณีที่มีการMouseDown
TreeView
ถ้าเป็นเช่นนั้นได้อย่างไร
มีการสร้างทั่วโลกที่ฉันสามารถใช้เมื่อใดก็ตามที่ฉันต้องการเข้าถึงไม่ว่าจะเป็นปุ่มควบคุม, Shift, Alt หรือไม่ ยกตัวอย่างเช่นภายในกรณีที่มีการMouseDown
TreeView
ถ้าเป็นเช่นนั้นได้อย่างไร
คำตอบ:
Keyboard
ระดับการใช้งาน ใช้Keyboard.IsKeyDown
คุณสามารถตรวจสอบว่าการควบคุม Shift, Alt ลงในขณะนี้
สำหรับกะ:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
สำหรับการควบคุม:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
สำหรับ Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
นอกจากนี้ยังมี:
// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
}
Keyboard.Modifiers == ModifierKeys.Shift
คำสั่ง หากคุณต้องการที่จะจับปุ่ม Shift แต่ไม่สนใจว่าตัวดัดแปลงอื่น ๆ ถูกกดในเวลาเดียวกัน(Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
หรือใช้ HasFlag หรือไวยากรณ์ที่ดีขึ้นมากKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
ฉันก็พยายามที่จะจับ
Keyboard.Modifiers
แสดงเป็นNone
private bool IsShiftKey { get; set; }
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
{
e.Handled = true;
}
}
นี่คือวิธีที่ฉันจัดการ (ใช้ PreviewKeyDown) สมมติว่าเรากำลังมองหา Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
บางทีใครบางคนสามารถอธิบายได้ว่าทำไมฉันถึงต้องใช้ e.SystemKey และไม่ใช่แค่ e.Key อาจเป็นเพราะตัวดัดแปลงหรือไม่ แต่สิ่งนี้ทำงานได้อย่างไม่มีที่ติสำหรับฉันเมื่อค้นหาตัวแก้ไข + แป้น
และเช่นกัน:
ถ้า My.Computer.Keyboard.ShiftKeyDown แล้ว ...
My.Computer.Keyboard.CtrlKeyDown
My.Computer.Keyboard.AltKeyDown
บางส่วนยืมจาก @Josh และค่อนข้างคล้ายกับ @Krushik และยังอ้างอิงคำถามเกี่ยวกับความแตกต่างระหว่าง KeyEventArgs.systemKey และ KeyEventArgs.Key (ตอบว่าทำไม Josh ต้องใช้ SystemKey); โดยมีปุ่มตัวดัดแปลง (เช่น Alt), e.Key ส่งคืน Key.System และทำให้คีย์ 'ของจริง' อยู่ใน e.SystemKey
วิธีนี้คือการดึงคีย์ 'ของจริง' ก่อนแล้วทำตามเงื่อนไขของคุณ:
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
// Fetch the real key.
var key = e.Key == Key.System ? e.SystemKey : e.Key;
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
&& key == Key.Return)
{
// Execute your code.
}
}
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
แทนสิ่งอื่น ๆ ทั้งหมด ...