How to add hot keys to your program.
בהמשך לפוסט על בדיקת שגיאות כתיב בכל מקום.
הבעיות שהתמודדתי איתן היו:
1. הפעלה של התוכנית ע"י צירוף מקשים כאשר האפליקציה שלי לא נמצאת בפוקוס.
2. קבלה של החלון שעכשיו המשתמש נמצא בתוכו ע"י שימוש בWin32 Api.
3. קבלת הטקסט מתוך החלון של המשתמש.
הפתרונות לבעיה מספר אחת:
עם הבעיה התמודדתי בהתחלה ע"י שימוש בספריה ManagedHooks שמאפשרת רישום לאירועי המערכת. כאשר האירוע מתקבל בתוכנה שלי, אני בודק האם המקש שנלחץ הוא המקש שאני מחכה לו. במידה וכן, אני מפעיל את בדיקת השגיאות.
לאחר חיפוש נוסף מצאתי את הפתרון השני, שהוא לרשום למערכת הפעלה את צירוף המקשים שלי כHotKey ע"י RegisterHotKey למידע בנושא ניתן לפנות לCodeProject. שיטה זו יותר נקיה ולא מתערבת בתוך מערכת הפעלה.
טריק יפה ששינתי מתוך הדוגמא שנמצאת בCodeProject הוא בצורה שבה אני מפעיל את הפונקציה RegisterHotKey בדוגמא שקראתי הייתה מתודה שידעה להמיר מהEnum של net.
המתודה נראית ככה:
/// <summary>
/// Calculates the character code of alphanumeric key of the Keys enum instance
/// </summary>
/// <param name="k">An instance of the Keys enumaration</param>
/// <returns>The character code of the alphanumeric key</returns>
public static byte CharCodeFromKeys(Keys k)
{
byte charCode = 0;
if ((k.ToString().Length == 1) || ((k.ToString().Length > 2) && (k.ToString()[1] == ',')))
charCode = (byte)k.ToString()[0];
else if ((k.ToString().Length > 3) && (k.ToString()[0] == 'D') && (k.ToString()[2] == ','))
charCode = (byte)k.ToString()[1];
return charCode;
}
לאחר דיבאג קצר ראיתי שהמתודה לא עובדת כאשר הKey שלי הוא לא אות.
במאמר שהופיע באתר, הוסבר שצריך לקחת מתוך הערך של k את ה4 סיביות הראשונות שהם מייצגות את המקש, ושאר הסיביות מיצגות את Shift Alt Ctrl .
אז החלפתי את הפונקיה בשורה אחת פשוטה:
/// <summary>
/// Calculates the character code of alphanumeric key of the Keys enum instance
/// </summary>
/// <param name="k">An instance of the Keys enumaration</param>
/// <returns>The character code of the alphanumeric key</returns>
public static byte CharCodeFromKeys(Keys k)
{
return (byte)((int)k & 0xFFFF);
}
ע"י שימוש פעולות בינאריות לקחתי רק את ה4 סיביות הראשונות של המספר.
דוגמאת קוד לשימוש בRegister ניתן למצוא בקוד המלא של CheckSpellingEveryWhere.
הצצה קצרה לקוד:
RegisterHotKey(this.Handle, id, ShortcutInput.Win32ModifiersFromKeys(cmd.HotKeys), ShortcutInput.CharCodeFromKeys(cmd.HotKeys));