לחצו את העכבר לתפוס אירועים מחוץ ליישום

למד כיצד לעקוב אחר פעילות העכבר גם כאשר יישום Delphi שלך אינו פעיל, יושב בתוך מגש או כן אין ממשק משתמש בכלל.

על ידי התקנת וו עכבר רחב מערכת (או גלובלית) אתה יכול לפקח על מה המשתמש עושה עם עכבר ולפעול בהתאם.

מהו וו ואיך זה עובד?

בקיצור, וו הוא (התקשר חזרה) שתוכלו ליצור כחלק מ- DLL (ספריית קישורים דינאמית - -) או היישום שלך לפקח על 'המתרחש' במערכת ההפעלה Windows.
ישנם שני סוגים של ווים - גלובליים ומקומיים. וו מקומי עוקב אחר דברים שקורים רק עבור תוכנית ספציפית (או חוט). וו עולמי עוקב אחר המערכת כולה (כל האשכולות).

כדי ליצור וו עולמי אתה זקוק לשני פרויקטים, 1 להכנת קובץ ההפעלה ו- 1 להכנת DLL המכיל את הליך ה- hook.

המאמר שלנו בנושא עובד עם ווים למקלדת מדלפי מסביר כיצד ליירט את כניסת המקלדת עבור פקדים שאינם יכולים לקבל את מיקוד הקלט (כמו TImage).

מחבר את העכבר

על ידי עיצוב, תנועת העכבר מוגבלת על ידי גודל מסך שולחן העבודה שלך (כולל סרגל המשימות של Windows). כשאתה מעביר את העכבר לקצה שמאל / ימין / עליון / תחתון, העכבר "יעצור" - כצפוי (אם אין לך יותר ממוניטור אחד).

להלן רעיון עבור וו העכבר הרחב המערכת: אם למשל, ברצונך להזיז את העכבר לצד ימין של המסך כאשר הוא נע לכיוון הקצה השמאלי (ו"נוגע בו "), אתה עשוי לכתוב וו עכבר גלובלי כדי למקם מחדש את העכבר מצביע.

instagram viewer

אתה מתחיל ביצירת פרויקט ספריית קישורים דינאמית. על ה- DLL לייצא שתי שיטות: "HookMouse" ו- "UnHookMouse".

נוהל HookMouse קורא ל- SetWindowsHookEx API מעביר את "WH_MOUSE" עבור הפרמטר הראשון - ובכך מתקין נוהל וו שמפקח על הודעות העכבר. אחד הפרמטרים ל- SetWindowsHookEx הוא פונקציית התקשרות חוזרת של Windows שתתקשר כשיש הודעת עכבר לעיבוד:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

הפרמטר האחרון (ערך = 0) ב- SetWindowsHookEx מגדיר שאנחנו רושמים וו גלובלי.

ה- HookProc מנתח את ההודעות הקשורות לעכבר ושולח הודעה מותאמת אישית ("MouseHookMessage") לפרויקט הבדיקה שלנו:

פונקציה HookProc (nCode: מספר שלם; MsgID: WParam; נתונים: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: בוליאני;

 כיוון העכבר: TMouseDirection;

התחל

 mousePoint: = PMouseHookStruct (נתונים) ^. pt;


 notifyTestForm: = שקר;


אם (עכבר פוינט. X = 0) לאחר מכן

התחל

 חלונות. SetCursorPos (-2 + מסך. רוחב, mousePoint.y);

 notifyTestForm: = נכון;

 כיוון העכבר: = mdRight;

סוף;

...
אם הודע על TestForm לאחר מכן

התחל

 PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));

סוף;

תוצאה: = CallNextHookEx (הוק, nCode, MsgID, נתונים);
סוף;

טיפ: קרא את קבצי העזרה של Win32 SDK כדי לגלות אודות רשומת PMouseHookStruct וחתימת הפונקציה HookProc.

הערה: פונקציית וו לא צריכה לשלוח שום דבר לשום מקום - שיחת PostMessage משמשת רק כדי לציין ש- DLL יכול לתקשר עם העולם "החיצוני".

וו העכבר "מאזין"

הודעת "MouseHookMessage" מוצגת לפרויקט הבדיקה שלך - טופס בשם "TMainHookTestForm". תעקוף את שיטת WndProc כדי לקבל את ההודעה ולפעול לפי הצורך:

תהליך TMainHookTestForm. WndProc (var הודעה: TMessage);

התחל

ירש WndProc (הודעה);

אם הודעה. Msg = HookCommon. עכבר לאחר מכן

התחל

// יישום שנמצא בקוד המלווה

 אות (TMouseDirection (הודעה. LParam));

סוף;

סוף;

כמובן שכאשר הטופס נוצר (OnCreate) אתה מתקשר להליך HookMouse מה- DLL, כשהוא נסגר (OnDestroy) אתה מתקשר להליך UnHookMouse.

הערה: ווים נוטים להאט את המערכת מכיוון שהם מגדילים את כמות העיבוד שעל המערכת לבצע עבור כל הודעה. עליך להתקין וו רק במידת הצורך, ולהסיר אותו בהקדם האפשרי.

instagram story viewer