التحكم في الحصول على مفاتيح الاختصار مثل علامة التبويب والمسافة
-
03-07-2019 - |
سؤال
لدي مربع حوار يسمح للمستخدمين بتعيين مفاتيح التشغيل السريع لاستخدامها في برنامج ثلاثي الأبعاد على نظام التشغيل Windows.أنا أستخدم CHotKeyCtrl، وهو أمر جيد جدًا، لكنه لا يتعامل مع بعض المفاتيح التي يرغب المستخدمون في استخدامها - على وجه التحديد، علامة التبويب والمسافة.
يعد التعامل مع مفتاح التشغيل السريع ذكيًا بما يكفي لأتمكن من تشغيل هذه المفاتيح، وأحتاج فقط إلى واجهة مستخدم للسماح بضبطها.قد يكون التحكم المشابه لـ CHotKeyCtrl مثاليًا، ولكن يتم أيضًا تقدير الحلول البديلة الأخرى.
المحلول
قد يكون أحد خيارات الحلول هو استخدام عنصر تحكم التحرير القياسي للمخزون مع وظيفة ربط الرسائل.
هذا من شأنه أن يسمح لك بمحاصرة لوحة المفاتيح WM_KEYDOWN الرسائل المرسلة إلى عنصر تحكم التحرير هذا.
ستبدو وظيفة الخطاف كما يلي:
LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
{
LRESULT lResult = 0;
if ((code >= 0) && (code == MSGF_DIALOGBOX))
{
if (lpMsg->message == WM_KEYDOWN)
{
//-- process the key down message
lResult = 1;
}
}
// do default processing if required
if (lResult == 0)
{
lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
}
return lResult;
}
يمكن بعد ذلك إرفاق الخطاف بعنصر تحكم التحرير عندما يتم التركيز على عنصر تحكم التحرير كما يلي:
//-- create an instance thunk for our hook callback
FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
hInstance);
//-- attach the message hook
FilterHook = SetWindowsHookEx(WH_MSGFILTER,
(HOOKPROC)FilterProc,
hInstance, GetCurrentThreadId());
ويتم إزالته عندما يفقد عنصر التحكم في التحرير التركيز كما يلي:
//-- remove a message hook
UnhookWindowsHookEx(MessageFilterHook);
باستخدام هذا الأسلوب، سيتم إرسال كل ضغطة على المفتاح إلى الخطاف، بشرط التركيز على عنصر التحكم في التحرير.