উইন্ডোজের জন্য কিবোর্ড লেআউট সুইচার
Date: []
Tags: [input], [scripting], [autohotkey], [windows]
আমি লিনাক্স ডেস্কটপে Super+Space শর্টকাট দিয়ে কিবোর্ডের লেআউট ইংরেজি এবং বাংলায় পরিবর্তন করি। অনেক সময় উইন্ডোজেও কাজ করতে হয়, তবে সেখানে লেআউট পরিবর্তনের জন্য উইন্ডোজের ভাষায় Windows+Space শর্টকাটটা কাজে লাগানোর সুযোগ নাই।
কিন্তু সুযোগ না থাকলে সুযোগ তৈরি করে নিতে হয়। 😎
উইন্ডোজ ডেস্কটপে বিভিন্ন ধরণের ছোটখাট অটোমেশনের জন্য অটোহটকি নামের একটা পাগলাটে সিনট্যাক্সের স্ক্রিপ্টিং ল্যাংগুয়েজ আছে। এটা দিয়ে বিভিন্ন কিবোর্ড শর্টকাটের সাথে স্ক্রিপ্ট অ্যাটাচ করা যায়। অতএব আমার কাজটা খুব সহজ: Windows+Space শর্টকাটটার সঙ্গে এমন একটা স্ক্রিপ্ট জুড়ে দেয়া, যা লেআউট টগল করতে পারে।
সফটওয়্যারটা ডাউনলোড করে windows-layout-switcher.ahk
নামে একটা স্ক্রিপ্ট লেখা শুরু করলাম। শর্টকাট ডিফাইন করার সিনট্যাক্সটা এরকম:
hotkey::
code to run
Return
অটোহটকি স্ক্রিপ্টে মডিফায়ারগুলোর জন্য বিশেষ ক্যারেক্টার বসাতে হয়, যেমন Shift এর জন্য +
, Windows এর জন্য ^
, ইত্যাদি:
^Space::
layout_switch_function
Return
দুঃখের বিষয় হচ্ছে অটোহটকি কিবোর্ড লেআউট পরিবর্তনের জন্য কোনো রেডিমেড ফাংশন রাখেনি। উইন্ডোজ নিজেও সরাসরি কোন ফাংশন কল করে না, বরং উইন্ডোগুলিতে লেআউট পরিবর্তনের জন্য একটা বিশেষ মেসেজ বা সিগনাল পাঠায়। মেসেজটা হচ্ছে:
0x0050
😆 উইন্ডোজ এপিআইতে এর একটা তুলনামূলক সহজবোধ্য গালভরা ডাকনাম আছে, WM_INPUTLANGCHANGEREQUEST
। এই মেসেজের সাথে দুইটা প্যারামিটার থাকে, wParam
আর lParam
, কোন লেআউট থেকে কোনটায় টগল করতে হবে ইত্যাদি জানানোর জন্য। wParam = 0x0002
সেট করে মেসেজ পাঠালে চক্রাকারে লেআউট পাল্টানো যায়।
অটোহটকি-এর PostMessage
নামের একটা ফাংশন দিয়ে এধরনের মেসেজ পাঠানো যায়। সিনট্যাক্সটা জেনে নিয়ে বোঝা গেল স্ক্রিপ্টটা হবে সহজ সরল:
^Space::
PostMessage, 0x0050, 0x0002,,, A
Return
ব্যাস! এই ছোট্ট স্ক্রিপ্টটা অটোহটকি দিয়ে চালিয়ে দিলেই হয়ে গেল! Windows+Space দিয়ে লেআউট সুইচ করতে পারছি উইন্ডোজেও!
…
আসলে এইটা চালালে কিছুই হবে না, ফট করে বন্ধ হয়ে যাবে, কারণ স্ক্রিপ্টটাকে চলমান থাকতে বলিনি। এ জন্য শুরুতে #Persistent
কমান্ডটা যোগ করতে হবে। আরও কিছু টুকটাক কনফিগারেশনসহ পুরো স্ক্রিপ্টটা দাঁড়ায় এইরকম:
/*
i use **super+space** to switch keyboard layouts in my linux desktop.
sadly windows does not have this as an option. this script enables that shortcut.
disable windows' own hotkey in language settings, then run this script at startup, and win!
*/
#NoEnv
#Persistent
;#NoTrayIcon
#SingleInstance Force
#InstallKeybdHook
#UseHook On
#KeyHistory 0
SetBatchLines -1
WM_INPUTLANGCHANGEREQUEST := 0x50
INPUTLANGCHANGE_BACKWARD := 0x0002
INPUTLANGCHANGE_FORWARD := 0x0004
INPUTLANGCHANGE_SYSCHARSET := 0x0001
^Space::
PostMessage, %WM_INPUTLANGCHANGEREQUEST%, %INPUTLANGCHANGE_FORWARD%,,, A
/*
| WM_INPUTLANGCHANGEREQUEST(
| wParam = new_locale_id|BACKWARD 0x0004|FORWARD 0x0002|SYSCHARSET 0x0001,
| lParam = locale_id // optional
| ) // https://docs.microsoft.com/en-us/windows/desktop/winmsg/wm-inputlangchangerequest
*/
Return
অটোহটকির সাথে ahk2exe নামে একটা কম্পাইলার থাকে। এইটা দিয়ে স্ক্রিপ্টটাকে কম্পাইল করে একটা এক্সিকিউটেবল প্রোগ্রাম (.exe) বানিয়ে সেটাকে উইন্ডোজের স্টার্টআপ ফোল্ডারে রেখে দিলে পরে উইন্ডোজ চালু হলেই স্বয়ংক্রিয়ভাবে লিনাক্সের মত করেই লেআউট পাল্টানোর সুযোগ পাবো!
স্ক্রিপ্টের কিছু দুর্বলতা আছে, যেমন উইন্ডোজ টেন-এ Windows+Space শর্টকাটটা অন্য কাজের জন্য নির্ধারিত করা থাকে, সেক্ষেত্রে সুপার কি আগে চেপে ধরা, স্পেস বার আগে ছেড়ে দেয়া, এ জাতীয় নিখুঁত টাইমিং স্কিল লাগে কখনো কখনো। তবে আমি প্রয়োজন পড়লে উইন্ডোজ সেভেনই চালাই (এখনও!), তাই বিরাট সমস্যায় না পড়া পর্যন্ত এইসব জটিলতা নিয়ে চিন্তিত নই।
তো… দেখা যাচ্ছে প্রধানত লিনাক্স নিয়ে লিখার জন্য ব্লগ খুলে উইন্ডোজের বিষয়েই রচনা লেখা শুরু করেছি। 😅