Option Explicit
' ===============================================
' Enum คือ การสร้างชุดข้อมูลชนิดค่าคงที่แบบเลขจำนวนเต็ม
' ===============================================
Public Enum EnumLangue
' จัดให้เรียงตามลำดับอักษรของภาษา และค่าคงที่ต้องไม่ซ้ำกัน
LANG_DEFAULT = &H0
LANG_AFRIKAANS = &H36
LANG_ALBANIAN = &H1C
LANG_ARABIC = &H1
LANG_ARMENIAN = &H2B
LANG_ASSAMESE = &H4D
LANG_AZERI = &H2C
LANG_BASQUE = &H2D
LANG_BELARUSIAN = &H23
LANG_BENGALI = &H45
LANG_BULGARIAN = &H2
LANG_CATALAN = &H3
LANG_CHINESE = &H4
LANG_CROATIAN = &H1A
LANG_CZECH = &H5
LANG_DANISH = &H6
LANG_DUTCH = &H13
LANG_ENGLISH = &H9
LANG_ESTONIAN = &H25
LANG_FAEROESE = &H38
LANG_FARSI = &H29
LANG_FINNISH = &HB
LANG_FRENCH = &HC
LANG_GEORGIAN = &H37
LANG_GERMAN = &H7
LANG_GREEK = &H8
LANG_GUJARATI = &H47
LANG_HEBREW = &HD
LANG_HINDI = &H39
LANG_HUNGARIAN = &HE
LANG_ICELANDIC = &HF
LANG_INDONESIAN = &H21
LANG_ITALIAN = &H10
LANG_JAPANESE = &H11
LANG_KANNADA = &H4B
LANG_KASHMIRI = &H60
LANG_KAZAK = &H3F
LANG_KONKANI = &H57
LANG_KOREAN = &H12
LANG_LATVIAN = &H26
LANG_LITHUANIAN = &H27
LANG_MACEDONIAN = &H2F
LANG_MALAY = &H3E
LANG_MALAYALAM = &H4C
LANG_MANIPURI = &H58
LANG_MARATHI = &H4E
LANG_NEPALI = &H61
LANG_NORWEGIAN = &H14
LANG_ORIYA = &H48
LANG_POLISH = &H15
LANG_PORTUGUESE = &H16
LANG_PUNJABI = &H46
LANG_ROMANIAN = &H18
LANG_RUSSIAN = &H19
LANG_SANSKRIT = &H4F
LANG_SERBIAN = &H1A
LANG_SINDHI = &H59
LANG_SLOVAK = &H1B
LANG_SLOVENIAN = &H24
LANG_SPANISH = &HA
LANG_SWAHILI = &H41
LANG_SWEDISH = &H1D
LANG_TAMIL = &H49
LANG_TATAR = &H44
LANG_TELUGU = &H4A
' =========================
' ไทยแลนด์บ้านของเฮาอยู่นี่
LANG_THAI = &H1E
' =========================
LANG_TURKISH = &H1F
LANG_UKRAINIAN = &H22
LANG_URDU = &H20
LANG_UZBEK = &H43
LANG_VIETNAMESE = &H2A
LANG_YIDDISH = &H3D
End Enum
' ===== ฟังค์ชั่นเหล่านี้ หากนำไปใช้ใน Module ต้องเปลี่ยนจาก Private เป็น Public ======
' http://msdn.microsoft.com/en-us/library/ms646298(VS.85).aspx
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias _
"GetKeyboardLayoutNameA" ( _
ByVal pwszKLID As String _
) As Long
' http://msdn.microsoft.com/en-us/library/ms646305(VS.85).aspx
Private Declare Function LoadKeyboardLayout Lib "user32" Alias _
"LoadKeyboardLayoutA" ( _
ByVal pwszKLID As String, _
ByVal flags As Long _
) As Long
' ===============================================================
' กำหนดค่าคงที่ Flags ในการสั่งให้ LoadKeyboardLayout ทำงาน (Activate)
Const KLF_ACTIVATE = &H1
' ค่านี้สามารถดูได้จาก API Text Viewer
' ===============================================================
' ===============================================================
' ยกตัวอย่างภาษาที่ต้องใช้ประจำ คือ ไทย - อังกฤษ
' หรือ Language Identifier Constants and Strings
' อ่านรายละเอียดเพิ่มเติมได้ที่
' http://msdn.microsoft.com/en-us/library/dd318693(VS.85).aspx
Private Const STR_LANG_ENGLISH As String = "00000409"
' ===============================================================
' จากเว็บของ "เล็กนิ่ม - Microsoft" ให้ดูค่าตารางจากหลักแรก ซึ่งเป็นค่า Locale identifier
' Locale identifier = รหัสที่ระบุเอาไว้ในแต่ละประเทศ (แปลให้พร้อมเสร็จสรรพ ... 55555+)
' 0x041E (0x คือ HexaDecimal หรือ เลขฐาน 16) แต่ต้องกำหนดเอาไว้เป็น String ด้วยน่ะครับ
' คำว่า String หรือ ข้อความ จะต้องอยู่ภายใต้เครื่องหมาย Double Quote ("") เสมอ
Private Const STR_LANG_THAI As String = "0000041E"
' ===============================================================
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
txtEnglish.Text = ""
txtThai.Text = ""
End Sub
' ==========================================================
' โปรแกรมย่อย (Function) ในการเปลี่ยนภาษาให้กับแป้นคีย์บอร์ด
' จะส่งกลับค่าเป็น TRUE เมื่อ KeyboardLayout ถูกกำหนดค่าถูกต้อง
' ==========================================================
Private Function SwitchKeyboardLang(ByVal strLangID As String) As Boolean
Dim strRet As String
On Error Resume Next
' ----------------------------------------------------------------------------------------------------------------
' แท้ที่จริงแล้ว เราสั่งด้วยคำสั่งบรรทัดเดียวก็เป็นอันจบแล้วแหละครับ
' strRet = LoadKeyboardLayout(strLangID, KLF_ACTIVATE)
' ผมถ่ายทอดแนวคิดในแบบฉบับนี้ของผมออกไป ก็เพื่อต้องการให้พี่น้อง ... ได้คิด ได้ฝึกฝน
' และต้องรอบคอบ ระมัดระวัง ต่อการใช้งาน Win32 API ให้ดีด้วย
' ----------------------------------------------------------------------------------------------------------------
' คือ จองพื้นที่แบบ String เอาไว้ 8 ตัว ตามจำนวนของ Locale identifier
' ลองคุณไม่จองเอาไว้ก่อนดูครับว่าจะมีผลเช่นไร ... คิดๆๆๆๆ แล้ว ก็ทำๆๆๆๆ
strRet = Space$(8)
' หรือ strRet = String$(8, 0) ... จองพื้นที่ว่างเปล่าใน Memory 8 ไบต์ (เมื่อ ASCII 0 = Null)
' อ่านค่ารหัสภาษา (Locale identifier) สถานะปัจจุบันก่อน
GetKeyboardLayoutName strRet
' หากภาษาที่กำหนดมามันตรงกับของเดิมอยู่แล้ว ก็ไม่ต้องไปทำอะไรอีก
' ส่งค่า TRUE กลับออกไปได้เลย ... เพื่อความรวดเร็ว และไม่เสียเวลา
If strRet = strLangID Then
SwitchKeyboardLang = True
Exit Function
Else
' เคลียร์ค่าใหม่
strRet = Space$(8)
' ติดต่อกับระบบปฏิบัติการ (OS) เพื่อให้โหลดรูปแบบภาษาตามที่กำหนดเอาไว้
strRet = LoadKeyboardLayout(strLangID, KLF_ACTIVATE)
End If
' ทดสอบหากเปลี่ยนภาษาได้สำเร็จ โดยอ่านค่าสถานะปัจจุบันเข้ามาอีกรอบ
' หรืออีกแง่มุมหนึ่ง ก็คือ การนำไปทดสอบว่าสถานะปัจจุบัน แป้นคีย์บอร์ดมันเป็นภาษาอะไร
GetKeyboardLayoutName strRet
' หากโหลดภาษาได้ตามที่ต้องการให้ส่งค่า TRUE กลับไป (DTAC ไม่ต้อง เพราะผมยังใช้งานอยู่ 55555+)
If strRet = strLangID Then SwitchKeyboardLang = True
End Function
' =========================================================
' เมื่อ Cursor ไปโฟกัสอยู่ที่ TextBox ก็ให้เลือกเอาว่าจะให้มันเป็นภาษาอะไร
' กรณีนี้ผมต้องการให้เป็นภาษาอังกฤษ เพื่อใช้ประโยชน์ในการสแกนรหัสบาร์โค้ดเข้าไป
' =========================================================
Private Sub txtEnglish_GotFocus()
Call Change2English
End Sub
Private Sub txtThai_GotFocus()
Call Change2Thai
End Sub
Private Sub Change2English()
If SwitchKeyboardLang(STR_LANG_ENGLISH) Then Me.Caption = "English Language"
End Sub
Private Sub Change2Thai()
If SwitchKeyboardLang(STR_LANG_THAI) Then Me.Caption = "ภาษาไทย"
End Sub
|