سؤال

كيف يمكنني تعطيل اختصارات لوحة المفاتيح على مستوى نظام التشغيل (مثل Alt-Tab و Ctrl-Alt-Left / Right وما إلى ذلك) على جهاز Linux [Ubuntu]؟أقوم بتطوير تطبيق Java Swing بملء الشاشة ولا أريد أن يتمكن المستخدم من تبديل المهام بعيدًا عن البرنامج بشكل تعسفي.لا يكفي تبديل علامة "دائمًا في المقدمة" ؛يجب ألا يُسمح للمستخدمين بتبديل مساحات العمل أو ترحيل التركيز أو أي أشياء أخرى من هذا القبيل.يجب أن يعمل الجهاز بشكل طبيعي قبل وبعد تنفيذ التطبيق.تقول Google أن هذا سيتطلب JNI أو JNA ولكني أبحث عن المزيد من إمساك اليد.

هل كانت مفيدة؟

المحلول

ليس هناك فائدة من محاولة القيام بذلك في التطبيق الخاص بك لأن أي من هذه التغييرات ستحتاج إلى معالجة بواسطة X11 و / أو مدير النوافذ لأن هذه هي ما يستجيب للأوامر. بافتراض أنك تتحكم في النظام الأساسي ، اختر مدير نافذة يدعم وضع الكشك. ثم استخدم إعدادات مدير النوافذ لبدء تطبيقك والدخول إلى وضع الكشك.

تتضمن خيارات مديري النوافذ الذين يمكنهم فعل ذلك KDE أو twm-kiosk .

(وإذا لم تكن تتحكم في النظام الأساسي ، فمن غير المحتمل أن تتمكن من اعتراض تطبيقك لأشياء مثل ctrl-alt-backspace على أي حال.)

تعديل:

استجابةً لنسخة مصغرة من السؤال الذي يرغب في السماح لأشياء مثل ctl-alt-backspace بالانتقال ويريد فقط معظم المفاتيح بما في ذلك علامة التبويب البديلة أو مجموعات مفاتيح تبديل التطبيقات المماثلة الأخرى ، يجب ما يلي العمل:

يجب أن تكون قادرًا على القيام بذلك باستخدام طريقة XLib XGrabKeyboard في XLib من خلال JNI. يجب أن يكون هذا البرنامج التعليمي لالتقاط الضغط على مفتاح Java / XLib JNI نقطة انطلاق جيدة . ومع ذلك ، فإنه يستخدم XGrabKey الذي يستمع بشكل سلبي للمفاتيح ولا يمنع التطبيقات الأخرى من تلقيها. ستحتاج بدلاً من ذلك إلى استخدام XGrabKeyboard الذي يعيق جميع أحداث لوحة المفاتيح العادية (والتي ، إذا كانت فرضية هذا سؤال StackOverflow صحيح ، ويتضمن مفاتيح تبديل المهام).

لاحظ أنه كتأثير جانبي ، من المحتمل أيضًا أن يتوقف التقاط المفتاح في Swing عن العمل لأن النوافذ المتأرجحة الخاصة بك ستكون منفصلة عن النافذة التي تنشئها في C. على هذا النحو ، ربما يتعين عليك استخدام واجهة JNI الخاصة بك احصل على الضغطات على المفاتيح لبرنامجك عند الحاجة. (على الرغم من أنني أنصح بالتأكيد باختباره أولاً قبل كتابة الكود.) قد تتمكن من تجنب ذلك إذا كان بإمكانك الحصول على النافذة باستخدام Java AWT Native Interface للحصول على معرّف النافذة. (لاحظ أن Swing مبني على AWT ، لذلك سيعمل هذا مع Swing.) ومع ذلك ، لست متأكدًا من كيفية القيام بذلك. يبدو أنك قد تكون قادرًا على التنقل في شجرة النافذة عن طريق الحصول على نافذة الجذر من شاشة العرض والانتقال من هناك للعثور على النافذة الخاصة بك ، ولكن كل هذا غريب. سيكون من الرائع لو أخبرك AWT NI للتو بمعرف النافذة ، لكن لا يبدو أنه يفعل ذلك.

مثل هذا التحذير تذكير: XGrabKeyboard ليس واجهة أمان يلاحظ أن هذا لا يجعل من المستحيل على البرامج الأخرى رؤية المفاتيح ، ولكن يبدو أن مديري النوافذ لن يستخدموا XQueryKeyMap لذلك من المحتمل أن يمنع تبديل المهام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top