หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 4 5 6 5 5 5 0

7 ธันวาคม พ.ศ.2549
584 Users On-Line.
Visitors - Page views
 7 7 1 6 4 7 7
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

Visual Basic 6.0 กับการสลับแป้นคีย์บอร์ดภาษาไทย - อังกฤษ แบบอัตโนมัติ

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 10/5/2552   เวลา: 04:56
(อ่าน : 23665) 
งานซอฟท์แวร์รวมๆโดยส่วนใหญ่ที่ผ่านๆมาของผม การค้นหาข้อมูลมักจะใช้ Keyword ในการค้นหาเป็นแบบภาษาไทยมากกว่าภาษาอังกฤษ แต่พอมาช่วงหลังๆนี้ ก็จะเป็นในเรื่องของการยิงรหัสบาร์โค้ดมากขึ้น ซึ่งรหัสบาร์โค้ดมันจะต้องเป็นภาษาอังกฤษเท่านั้น ปัญหาที่เกิดขึ้นก็จะพบเลยว่า ผู้ใช้งานมักจะลืมเปลี่ยนคีย์บอร์ด ให้เป็นภาษาอังกฤษก่อนที่จะทำการอ่านรหัสบาร์โค้ดเข้าไป บางรายถึงขนาดโทรมาต่อว่าต่อขานผมเลย ก็ผมได้ยืนยัน นั่งยัน นอนยัน ไปว่า เครื่องอ่านบาร์โค้ดมันไม่ต้องติดตั้ง Driver ใดๆทั้งสิ้น พอเสียบจึ๊กเข้าเครื่องมันก็ทำงานได้ทันทีเลย คุยไปคุยมา พอผมบอกให้ลองกดเครื่องหมาย ~ (Tilt) เพื่อสลับภาษา ก็แค่นั้นเองแหละครับ แม่เจ้าประคุณทูนหัวก็ตอบกลับว่ามันอ่านรหัสได้แล้ว ... กระจึ๋ย ... อย่ากระนั้นเลยผมก็ต้องมาปรับงานของผม (คนดีชอบแก้ไขครับ ... อิอิอิ) ให้ TextBox ที่ใช้ในการรับค่ารหัสบาร์โค้ดนั้น พอมันได้รับ Focus ปั๊บ (Cursor ไปอยู่ที่ตำแหน่งของ TextBox ที่ต้องการ) ก็ให้บังคับเปลี่ยนภาษาอังกฤษไปในทันที ... จบ
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
  • Design Time
  • รับค่าภาษาอังกฤษ (เหตุการณ์ GotFocus)
  • รับค่าภาษาไทย
    เริ่มต้นกระบวนการทำงาน
    
    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
    
    Conclusion:
    A little case study: ผมกล้าฟันธง และ คอนเฟิร์ม ได้เลยว่า มีนักพัฒนาซอฟท์แวร์หลายคนมักจะโทษว่ามันเป็นความผิดของ User เอง แทนที่จะกลับมานั่งคิดว่า ทำยังไงดีที่จะปรับปรุงงาน สร้างความสะดวกให้แก่ผู้ใช้งานเขา (หรือ เธอ) มากขึ้น และลดความผิดพลาดในการทำงานให้มันน้อยลงไป นอกจากนี้แล้ว บทความนี้ ผมต้องการสื่อไปถึงสำหรับมือใหม่ มือกลาง ที่ยังไม่แกร่งพอ มันยังเป็นการพัฒนาแนวความคิดของตัวเองออกไปได้อีกด้วยน่ะครับ ... พี่น้อง (จากใจจริงของคนที่ชอบเป็นนายตัวเองครับ ... ลงชื่อ นายทองก้อน นารีแขยง)

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: thongkorn@hotmail.com หรือ โทร. 08-6862-6560