קיצורי מקשים באפליקציית C# WPF
-
אשמח אם מישהו יכול להדריך אותי איך יוצרים קיצורי מקשים גלובליים באפליקצייה של wpf ב C#
לדוגמא cntrl +o לפתיחת קובץ וכן הלאה
תודה מראש
-
קיצורי מקשים גלובליים
השאלה היא מה זה גלובליים.
אם גלובליים אתה מתכוון לא משנה באיזה חלון/פקד של האפליקציה שלך, אז אתה צריך לדאוג להירשם בכל Window לאירוע PreviewKeyDown.אם במילה גלובליים אתה מתכוון על כלל המחשב, ולא רק ברחבי האפלקיציה שלך, אתה צריך להירשם לhook של המערכת הפעלה, ראה את המאמר דלהלן https://learn.microsoft.com/en-us/archive/blogs/toub/low-level-keyboard-hook-in-c.
נ.ב. כותרת מצויינת (למעט המילה C#, כי wpf זה תמיד .net וההבדל בין השפות מסתכם הקשקושים שGPT ימיר לך בשמחה).
-
@dovid כתב בקיצורי מקשים באפליקציית C# WPF:
אם גלובליים אתה מתכוון לא משנה באיזה חלון/פקד של האפליקציה שלך, אז אתה צריך לדאוג להירשם בכל Window לאירוע PreviewKeyDown.
כוונתי הייתה לאפליקצייה שלי סליחה שלא פירטתי.
בכל אופן previewkeydown לכאורה נותן לי את האופציה למקש אחד לא קובינציה של מקשים.
זה מה שניסיתיprivate void UserControl_PreviewKeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.C) { // Handle Ctrl + C here MessageBox.Show("Ctrl + C pressed!"); } }
הוא קולט את הcntrl ולא את ה-c
אגב: למה previewkeydown ולא keydown?
-
קלטתי את הטעות שלי ב'וד הקודם צריך להפוך את הסדר קודם לקלוט את המקש ואז את הmodifier
ככהprivate void UserControl_PreviewKeyDown(object sender, KeyEventArgs e) { if (Key.C == e.Key && Keyboard.Modifiers == ModifierKeys.Control) { e.Handled = true; } }
ועוד משהו חשוב יש לעשות e.handeled כדי למנוע פעולה בלתי רצויה למשל בתוך textbox שיקליד לך גם את האות C
אבל לא הצלחתי לעשות עם שלוש מקשים כמו:cntrl+shift+c
-
@pcinfogmach כתב בקיצורי מקשים באפליקציית C# WPF:
קלטתי את הטעות שלי ב'וד הקודם צריך להפוך את הסדר קודם לקלוט את המקש ואז את הmodifier
מה ההיגיון? אצלי שניהם עובדים.
אבל לא הצלחתי לעשות עם שלוש מקשים כמו:cntrl+shift+c
המאפיין Keyboard.Modifiers הוא מסוג ביט פלאג, שזה בעצם אומר שהוא יכול להכיל כמה כן/לא בבת אחת.
בודקים את התוכן שלו על ידי פעולות על סיביות, תוכל לחפש על זה בפורום (המילה סיביות או bitwise), ככה:if (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.C)
אגב: למה previewkeydown ולא keydown?
כדי לתפוס גם מה שאירועים אחרים מאזינים ומבצעים כבר
e.Handled = true
ואז אתה תפספס את האירוע.
ככה אתה הראשון ואתה מחליט אם להעביר להם.