Khắc phục [QR-Code] sai do bộ gõ tiếng Việt ?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,214
Xin chào các bạn.
Có thể sử dụng code để điều khiển ứng dụng Unikey được không ạ?
Ví dụ: Unikey đang ở chế độ gõ tiếng Việt, sau khi chạy code chuyển sang chế độ gõ tiếng Anh. Hoặc Unikey đang mở thì đóng lại ạ.
**********************************
Bài viết của tôi đã được giải quyết,hiện tôi đã đưa vào áp dụng kết quả đã OK đối với tôi.

Trong chủ đề có nhiều hướng giải quyết, nhưng tôi xin phép được trích dẫn link các bài viết tiêu biểu trong chủ đề để các bạn tiện theo dõi:
1.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/#post-902152
2.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/page-3#post-902364
3.https://www.giaiphapexcel.com/diendan/threads/khắc-phục-qr-code-sai-do-bộ-gõ-tiếng-việt.140358/page-7#post-902900

Xin trân trọng cảm ơn tất cả mọi người đã nhiệt tình giúp đỡ và đóng góp ý kiến, đặc biệt với sự giúp đỡ tận tình của các thành viên: Bác @batman1 (@siwtom ) , Anh @huuthang_bd , Anh @Nguyễn Duy Tuân và Bạn @HeSanbi

Xin trân trọng cảm ơn BQT đã tạo ra và đã mang đến cho tôi và mọi người một nơi thật tuyệt vời, một nơi để mọi người cùng nhau có thể trao đổi/học hỏi và cùng nhau thành công trong sự nghiệp.
 
Lần chỉnh sửa cuối:
Tôi đã test qua loa trên Win 10 của hàng xóm thì thấy không ổn. Chắc cấu trúc của Tray khác nhau trong các phiên bản.

Nhân tiện có người sẵn sàng test nên tôi vọc chút. :D

Tôi tải bản Unikey 4.0 RC2 về và thấy như sau. Khi Unikey đang ở chế độ vietnamese và tôi cho trỏ chuột vào biểu tượng thì có lời gợi ý: Click to turn off Vietnamese mode

Tôi nghĩ lời gợi ý này không thay đổi qua các phiên bản. Vậy thì ta chỉ cần đọc ra lời gợi ý và xem nó có đang là Click to turn off Vietnamese mode hay không. Ý tưởng này tôi giải quyết ở phần tiếp theo.

Như vậy ta đã có code đóng Unikey. Còn code không đóng mà chuyển về chế độ Anh. Tức đang ở chế độ Anh thì không làm gì, ngược lại thì chuyển về chế độ Anh.

Tất nhiên để làm được thì ta phải dùng API đọc ra lời gợi ý. Nếu đang là vietnamese (Click to turn off Vietnamese mode) thì chuyển về Anh. Code chuyển lần trước dùng keybd_event để giả nhấn Ctrl + Shift. Lần này ta dùng cơ chế nền tảng, cốt lõi của system Windows, tức thông điệp - gửi thông điệp. Cụ thể là gửi thông điệp WM_LBUTTONDOWN và WM_LBUTTONUP

Code trong Module1. Chạy sub VietnameseOff. Bạn test nếu thành công thì báo cáo nhé. Code viết cho 32 bit.

Mã:
Option Explicit

Private Const WM_USER As Long = &H400
Private Const TB_BUTTONCOUNT As Long = (WM_USER + 24)
Private Const TB_GETBUTTON As Long = (WM_USER + 23)
Private Const MEM_COMMIT As Long = &H1000
Private Const MEM_RELEASE As Long = &H8000
Private Const PAGE_READWRITE As Long = &H4
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const WM_LBUTTONUP As Long = &H202
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Private Type TTBButton
    iBitmap As Long
    idCommand As Long
    fsState As Byte
    fsStyle As Byte
    bReserved(0 To 1) As Byte
    dwData As Long
    iString As Long
End Type

Private Type TRAYDATA
    hwnd As Long
    uID As Long
    uCallbackMessage As Long
    Reserved(0 To 1) As Long
    hIcon As Long
End Type

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Private Function TrayToolbarWnd() As Long
Dim hTB As Long
    hTB = FindWindow("Shell_TrayWnd", vbNullString)
    If hTB <> 0 Then
        hTB = FindWindowEx(hTB, 0, "TrayNotifyWnd", vbNullString)
        If hTB <> 0 Then
            hTB = FindWindowEx(hTB, 0, "SysPager", vbNullString)
            If hTB <> 0 Then hTB = FindWindowEx(hTB, 0, "ToolbarWindow32", vbNullString)
        End If
    End If
    TrayToolbarWnd = hTB
End Function

Sub VietnameseOff()
Dim nCount As Long, k As Long, sTip As String
Dim tb As TTBButton, tray As TRAYDATA, r As Long
Dim pid As Long, pMemory As Long, hTB As Long, hProcess As Long, BytesRead As Long
    hTB = TrayToolbarWnd
    GetWindowThreadProcessId hTB, pid
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
    If hProcess = 0 Then Exit Sub
    nCount = SendMessage(hTB, TB_BUTTONCOUNT, 0, 0)
    pMemory = VirtualAllocEx(hProcess, ByVal 0, ByVal 1024, MEM_COMMIT, PAGE_READWRITE)
    For k = 0 To nCount - 1
        SendMessage hTB, TB_GETBUTTON, k, pMemory
        ReadProcessMemory hProcess, ByVal pMemory, tb, LenB(tb), BytesRead
        ReadProcessMemory hProcess, ByVal tb.dwData, tray, LenB(tray), BytesRead
        sTip = String(1024, Chr(0))
        ReadProcessMemory hProcess, ByVal tb.iString, ByVal StrPtr(sTip), 1024, BytesRead
        sTip = Left(sTip, InStr(1, sTip, Chr(0)) - 1)
        If sTip = "Click to turn off Vietnamese mode" Then
            PostMessage tray.hwnd, tray.uCallbackMessage, tray.uID, WM_LBUTTONDOWN
            PostMessage tray.hwnd, tray.uCallbackMessage, tray.uID, WM_LBUTTONUP
        End If
    Next k
    VirtualFreeEx hProcess, pMemory, 0, MEM_RELEASE
    CloseHandle hProcess
End Sub

Code của anh dùng API để tắt mở Unikey sẽ là ứng dụng chạy mượt hơn và bảo toàn việc scanner không lỗi sót ký tự. Nhưng code này chỉ chạy được trên Windows XP. Với Windows version cao hơn thì không chạy đúng, chỉ cần fix đoạn này thì đây sẽ là giải pháp tốt nhất.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã test qua loa trên Win 10 của hàng xóm thì thấy không ổn. Chắc cấu trúc của Tray khác nhau trong các phiên bản.

Nhân tiện có người sẵn sàng test nên tôi vọc chút. :D

Tôi tải bản Unikey 4.0 RC2 về và thấy như sau. Khi Unikey đang ở chế độ vietnamese và tôi cho trỏ chuột vào biểu tượng thì có lời gợi ý: Click to turn off Vietnamese mode

Tôi nghĩ lời gợi ý này không thay đổi qua các phiên bản. Vậy thì ta chỉ cần đọc ra lời gợi ý và xem nó có đang là Click to turn off Vietnamese mode hay không. Ý tưởng này tôi giải quyết ở phần tiếp theo.

Như vậy ta đã có code đóng Unikey. Còn code không đóng mà chuyển về chế độ Anh. Tức đang ở chế độ Anh thì không làm gì, ngược lại thì chuyển về chế độ Anh.

Tất nhiên để làm được thì ta phải dùng API đọc ra lời gợi ý. Nếu đang là vietnamese (Click to turn off Vietnamese mode) thì chuyển về Anh. Code chuyển lần trước dùng keybd_event để giả nhấn Ctrl + Shift. Lần này ta dùng cơ chế nền tảng, cốt lõi của system Windows, tức thông điệp - gửi thông điệp. Cụ thể là gửi thông điệp WM_LBUTTONDOWN và WM_LBUTTONUP

Code trong Module1. Chạy sub VietnameseOff. Bạn test nếu thành công thì báo cáo nhé. Code viết cho 32 bit.

Mã:
Option Explicit

Private Const WM_USER As Long = &H400
Private Const TB_BUTTONCOUNT As Long = (WM_USER + 24)
Private Const TB_GETBUTTON As Long = (WM_USER + 23)
Private Const MEM_COMMIT As Long = &H1000
Private Const MEM_RELEASE As Long = &H8000
Private Const PAGE_READWRITE As Long = &H4
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const WM_LBUTTONUP As Long = &H202
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Private Type TTBButton
    iBitmap As Long
    idCommand As Long
    fsState As Byte
    fsStyle As Byte
    bReserved(0 To 1) As Byte
    dwData As Long
    iString As Long
End Type

Private Type TRAYDATA
    hwnd As Long
    uID As Long
    uCallbackMessage As Long
    Reserved(0 To 1) As Long
    hIcon As Long
End Type

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Private Function TrayToolbarWnd() As Long
Dim hTB As Long
    hTB = FindWindow("Shell_TrayWnd", vbNullString)
    If hTB <> 0 Then
        hTB = FindWindowEx(hTB, 0, "TrayNotifyWnd", vbNullString)
        If hTB <> 0 Then
            hTB = FindWindowEx(hTB, 0, "SysPager", vbNullString)
            If hTB <> 0 Then hTB = FindWindowEx(hTB, 0, "ToolbarWindow32", vbNullString)
        End If
    End If
    TrayToolbarWnd = hTB
End Function

Sub VietnameseOff()
Dim nCount As Long, k As Long, sTip As String
Dim tb As TTBButton, tray As TRAYDATA, r As Long
Dim pid As Long, pMemory As Long, hTB As Long, hProcess As Long, BytesRead As Long
    hTB = TrayToolbarWnd
    GetWindowThreadProcessId hTB, pid
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
    If hProcess = 0 Then Exit Sub
    nCount = SendMessage(hTB, TB_BUTTONCOUNT, 0, 0)
    pMemory = VirtualAllocEx(hProcess, ByVal 0, ByVal 1024, MEM_COMMIT, PAGE_READWRITE)
    For k = 0 To nCount - 1
        SendMessage hTB, TB_GETBUTTON, k, pMemory
        ReadProcessMemory hProcess, ByVal pMemory, tb, LenB(tb), BytesRead
        ReadProcessMemory hProcess, ByVal tb.dwData, tray, LenB(tray), BytesRead
        sTip = String(1024, Chr(0))
        ReadProcessMemory hProcess, ByVal tb.iString, ByVal StrPtr(sTip), 1024, BytesRead
        sTip = Left(sTip, InStr(1, sTip, Chr(0)) - 1)
        If sTip = "Click to turn off Vietnamese mode" Then
            PostMessage tray.hwnd, tray.uCallbackMessage, tray.uID, WM_LBUTTONDOWN
            PostMessage tray.hwnd, tray.uCallbackMessage, tray.uID, WM_LBUTTONUP
        End If
    Next k
    VirtualFreeEx hProcess, pMemory, 0, MEM_RELEASE
    CloseHandle hProcess
End Sub
Con chào Bác Siwtom,
Con đã tải file kèm của Bác về và chạy sub VietnameseOff nhưng không thấy hiện tượng gì sảy ra,cũng không thông báo lỗi gì ạ.

Trước khi chạy code Unikey để chế độ tiếng Việt ạ, và khi con "trỏ chuột vào biểu tượng thì cũng có lời gợi ý: Click to turn off Vietnamese mode".
Con đang sử dụng Win10/Office2016 32bit ạ.
 
Upvote 0
Mình mới xem qua 2 file của 2 bạn đó. Thì mình thấy về cơ bản cả 2 cách đó đều dùng Userform với Textbox để nhận keycode từ scanner. Hướng đi như vậy là đúng như mình nói ban đầu với bạn. Cả 2 file nều cơ bản là ổn, tuy có vài cái nếu bạn sử dụng thì nên cải tiến nó:

1. File của Vô danh: Tuy ngắn gọn nhưng lại bỏ qua nhiều ký tự trong bảng mã chuẩn, ví dụ các ký tự "-", "[", "]",... các ký tự này vẫn nằm trong bộ nhận dạng của máy quét. Nên bạn phải chỉnh sửa mới không bị sót ký tự.

2. File của bạn Huuthang: File bao hàm được các ký tự hơn nhưng cần để keycode vbDelete hoạt động. Trong thực tế vẫn có thể có tình huống hy hữu xảy ra thì người ta vẫn có thể sửa/xóa ký tự trong dải chuỗi. Hoặc bạn thêm nút chắc năng làm việc này. Tuy nhiên, file này tốc độ sử ký key hơi chậm, bạn để ý mỗi ký tự có một độ trễ. Nếu bạn dùng code của file này thì cân nhắc vấn đề mình nói (có thể không phải lớn) thì ok hơn của Vô danh.

Điều quan trọng nữa. Các thiết bị scanner thường không đọc unicode nên ký tự có dấu thường được chuyển đổi về ANSI CHAR. Nếu bạn dùng QR code thì nên test kỹ hơn các mẫu của các nhà phân phối để đảm bảo không sót ký tự, vì QR code người ta thường mô tả nội dung "tự do" khác với Barcode.
Cảm ơn anh Tuân đã góp ý ạ,tạm thời OT sử dụng OK chưa phát sinh vấn đề gì ạ.
Nếu anh có hướng các sử dụng trên Form tối ưu hơn anh cho OT và những bạn khác đang quan tâm đến vấn đề này tham khảo với ạ.
Cảm ơn anh nhiều ạ.
 
Upvote 0
Code của anh dùng API để tắt mở Unikey sẽ là ứng dụng chạy mượt hơn và bảo toàn việc scanner không lỗi sót ký tự. Nhưng code này chỉ chạy được trên Windows XP. Với Windows version cao hơn thì không chạy đúng, chỉ cần fix đoạn này thì đây sẽ là giải pháp tốt nhất.
Vì tôi chỉ có XP Home thôi mà. Vài lúc sau mới giật mình vì đã từng nhìn Win 10 có Tray hơi khác. :D

Hướng này không được, vì có thể mỗi phiên bản lại khác nhau. Nếu làm được thì cũng rất mất công.

Cũng còn tùy vào nhu cầu sử dụng Unikey. Nếu máy dùng để quét QR code liên tục thì tắt Unikey cho rồi. Nếu người ta có nhu cầu thỉnh thoảng dùng Unikey thì cách chuyển về chế độ Anh không dùng được. Vì giả sử sau khi chạy code thì chuyển được về Anh nhưng sau đó người ta có nhu cầu và người ta chuyển lại về chế độ Việt thì ai biết khi nào họ chuyển và khi nào họ hết nhu cầu viết tiếng Việt để lại chạy code chuyển về Anh?
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh Tuân đã góp ý ạ,tạm thời OT sử dụng OK chưa phát sinh vấn đề gì ạ.
Nếu anh có hướng các sử dụng trên Form tối ưu hơn anh cho OT và những bạn khác đang quan tâm đến vấn đề này tham khảo với ạ.
Cảm ơn anh nhiều ạ.

Ok bạn. Hiện tại mình thấy các giải pháp trên là cũng oone rồi. Nếu cách của bác Batman1 hoàn thiện được API dùng cho Windows > XP thì tốt nhất.
 
Upvote 0
Giải pháp tốt nhất, là lấy mã nguồn hoặc nói tác giả unikey sửa lại code sao cho khi OT bật máy quét QR code, thì unikey phải lặng im rút không xử lý phím tiếng việt hay phím gì khác cả, thì như thế là tiện nhất
Còn mọi giải pháp khác can thiệp đều từ ngoài vào, mà từ ngoài vào tốt nhất là đập nó đi (tắt unikey)
 
Upvote 0
Giải pháp tốt nhất, là lấy mã nguồn hoặc nói tác giả unikey sửa lại code sao cho khi OT bật máy quét QR code, thì unikey phải lặng im rút không xử lý phím tiếng việt hay phím gì khác cả, thì như thế là tiện nhất
Còn mọi giải pháp khác can thiệp đều từ ngoài vào, mà từ ngoài vào tốt nhất là đập nó đi (tắt unikey)

Híc T_T

Vấn đề đến thời điểm này đã khá ổn rồi ạ, để chắc ăn nhất sau khi tham khảo góp ý của anh Tuân ở bài #81. OT sẽ sử dụng 1 lúc đồng thời 2 giải pháp :
1. Tắt unikey tại bài 13 của bác Siwtom (yên tâm phần bộ gõ tiếng Việt)
2. Thông qua Form tại bài 57 của anh Hữu Thắng (đẹp + xử lý capslock + unikey)
3. Hóng thêm giải pháp khác của anh Tuân ạ :p

Xin trân trọng cảm ơn tất cả các Bác/Anh/Bạn nhiều ạ.
Chúc tất cả mọi đón chào một năm mới vui khỏe, công tác tốt sự nghiệp thành công rực rỡ ạ.
Oanh Thơ
 
Upvote 0
Code của anh dùng API để tắt mở Unikey sẽ là ứng dụng chạy mượt hơn và bảo toàn việc scanner không lỗi sót ký tự. Nhưng code này chỉ chạy được trên Windows XP. Với Windows version cao hơn thì không chạy đúng, chỉ cần fix đoạn này thì đây sẽ là giải pháp tốt nhất.
Chắc đây "Windows API" là nơi khám phá để Code Anh @batman1 hoàn thiện cho các Version.
Không biết ảnh có làm nổi nữa không chứ thấy ảnh hỗ trợ bài này mấy ngày rồi. Chắc đang thở cũng hơi gấp đây

Trong Windows API đó có đoạn "Sử dụng API Windows, bạn có thể phát triển các ứng dụng chạy thành công trên tất cả các phiên bản Windows trong khi tận dụng các tính năng và khả năng duy nhất cho từng phiên bản. "

Từ Office 2010 mới có định nghĩa con trỏ. Nếu viết hết ứng dụng cho toàn bộ Nền tảng, Win , và Office chắc "khóc thét"

Em nghĩ vấn đề Code của anh @batman1 nên có một Topic mới để mọi người cùng nhau hoàn thiện.
Tại vì sẽ có đủ nhân lực để test từ WinXP... Win10, 32 và 64. Và thêm sự đóng góp của họ

Khi viết ra một ứng dụng tốt lại để nó nằm lẻ trong Topic. Và đóng vai phụ khá xuất sắc thì rất phí "Công sức và Tài nguyên trí tuệ"

Nguyễn Hoàng Oanh Thơ nên xem xét sự yêu cầu tuyệt đối của ứng dụng.
 
Upvote 0
Chắc đây "Windows API" là nơi khám phá để Code Anh @batman1 hoàn thiện cho các Version.
Không biết ảnh có làm nổi nữa không chứ thấy ảnh hỗ trợ bài này mấy ngày rồi. Chắc đang thở cũng hơi gấp đây

Trong Windows API đó có đoạn "Sử dụng API Windows, bạn có thể phát triển các ứng dụng chạy thành công trên tất cả các phiên bản Windows trong khi tận dụng các tính năng và khả năng duy nhất cho từng phiên bản. "

Thì tôi cũng đã nói rồi
Nếu làm được thì cũng rất mất công.
Cái mấu chốt là ta chuyển về chế độ Anh, nếu ta làm được, nhưng công nhân họ lại chuyển về Việt liên tục thì code làm sao biết họ chuyển để mà chuyển lại. Nếu cho phép họ chuyển vì ngoài quét QR code thì họ còn phải viết văn bản thì làm sao để biết khi nào thì họ hết viết tiếng Việt để chuyển lại chế độ Anh? Chỉ có họ biết khi nào họ thôi cần viết tiếng Việt chứ code làm sao biết được? Nếu họ chuyển mà lập tức code chuyển lại thì làm sao họ viết được tiếng Việt khi cần?
 
Upvote 0
Kịch bản: Quy định file (hoặc oánh dấu) chỉ dành cho việc scan (flag). Cứ thấy flag thì unikey chuyển sang E hoặc taskkill nó.

Vậy được không nhỉ
 
Upvote 0
Kịch bản: Quy định file (hoặc oánh dấu) chỉ dành cho việc scan (flag). Cứ thấy flag thì unikey chuyển sang E hoặc taskkill nó.

Vậy được không nhỉ
Chắc không, vì lo nhân viên, vừa mở file excel để scan QR vừa còn muốn gõ tiếng Việt.
 
Upvote 0
Giới hạn chỗ chỉ nhận scan rồi anh. Cửa sổ active thì chỉ có một. Muốn gõ tiếng Việt tới chỗ khác.
Nếu công nhân đã thuộc diện không thiết tha với công việc (lương thấp, chế độ không có ...), mà có đuổi việc họ cũng không tiếc như trường hợp của OT, thì khi có được công nhân rồi thì phải chiều họ hết mức. Họ ho một chút là dâng ngay thuốc, thấy mồ hôi là lau ngay cho họ ... Làm gì có chuyện "Muốn gõ tiếng Việt tới chỗ khác". Công nhân mà họ bực lên họ thôi việc thì lại chết.

Tôi đã từng gặp những người làm công mà như là sếp, còn quan trọng hơn cả sếp. Ở nhiều nước Đông Âu có chuyện mở quán, nhà hàng Việt. Đầu bếp lương cao mà còn phải chiều đủ thứ. Có thằng đầu bếp giỏi lúc nó bực lên thì nó còn quăng cả bát đĩa vào sếp, cầm dao đuổi chém sếp. Thế mà có sếp phản nín nhịn. Vì đuổi nó thì "tậu" đâu ra đầu bếp ngay bây giờ? Chả nhẽ đóng cửa quán, nhà hàng?

Công ty OT nghèo, có sa thải người ta cũng chả tiếc mà dám nói "Muốn gõ tiếng Việt tới chỗ khác"? Nó dọa thôi việc thì lại ăn không ngon ngủ không yên cho biết thế nào là lễ độ :D
 
Upvote 0
File của Vô danh: Tuy ngắn gọn nhưng lại bỏ qua nhiều ký tự trong bảng mã chuẩn, ví dụ các ký tự "-", "[", "]",... các ký tự này vẫn nằm trong bộ nhận dạng của máy quét. Nên bạn phải chỉnh sửa mới không bị sót ký tự.
Công nhận anh giàu kiến thức với kinh nghiệm nên nhìn ra ngay vấn đề. Em cứ đinh ninh là chr(keycode) là ra y chang mọi ký tự gõ trên bàn phím. Mới kiểm tra lại thì đúng là có nhiều ngoại lệ ngoài dự tính. Cũng có ý tưởng để hoàn thiện nó nhưng cảm giác sẽ còn nhiều vấn đề kỹ thuật nữa nên không theo nữa.

Giải quyết triệt để vấn đề này cũng khó mà áp dụng cho mỗi trường hợp này thì đúng là quá phí nếu xét công sức xử lý những vấn đề kỹ thuật cần giải quyết. Tôi thấy có bạn đề cập đến việc chỉnh sửa code của Unikey nhưng lại ái ngại những vấn đề kỹ thuật phát sinh. Mà nếu sửa code Unikey cho mỗi cái khoản đọc mã vạch không thôi thì cũng quá lãng phí vì có khi chỉ dùng được cho phần mềm mã vạch nào được xác định. Trong khi có khá nhiều tình huống dở khóc với Unikey khi một ứng dụng nào đó dụng tính năng Sendkey hay Send... gì đấy. Khá nhiều chương trình có tính năng này điển hình như tính năng tự bỏ dấu trên nhiều trang Web mà không cho tắt.

Tôi nảy ra ý tưởng nếu Unikey phân biệt đâu là tương tác phím do con người và đâu là tương tác do lập trình thì giải quyệt triệt để được vấn đề. Cái này nghe có vẻ rất khó nhưng thực ra thì hơi dễ.

Tốc độ gõ bàn phím siêu nhanh của người thường là khoảng 60 từ mỗi phút, ước khoảng bình quân 7 lần gõ mỗi giây (1/7 giây). Vậy nếu phát hiện lần gõ kế tiếp dưới 1/10 giây thì chắc chắn đến 99,99% là do lập trình chứ không phải do tác động phím của người dùng (trừ khi có người gõ nhầm 2 nút liền kề - coi như lỗi luôn rồi). Dựa vào tốc độ tương tác với phím, Unikey sẽ biết đâu là do người dùng "gõ tay" và đâu là do ứng dụng "gửi lệnh gõ" và sẽ quyết định chuyển hóa thành có dấu hay không.

Bây giờ Unikey không còn dùng dll bắt phím của một anh Tây như hồi xưa mà đã viết hoàn toàn lại nguồn mở nữa nên chắc là có nhiều cơ hội để chỉnh sửa. Tiếc là tôi không đủ khả năng để thực hiện nên coi như là huyên thuyên một tý nhưng mà không có dụng ý nói xấu ai.--=0

Hy vọng ý tưởng của tôi sẽ được thực hiện trên Unikey trong tương lai không xa.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách của bác Batman1: Dùng hàm API để lấy Tips của Unikey và so sánh với chuỗi "Click to turn off Vietnamese mode" có vẻ vô phương với Windows 10. Nghe giang gồ nói không có API để lấy được Handle chứa danh sách Icon của các ứng dụng trên nó. Microsoft hình như không cung cấp API để chui vào đây. Tuy nhiên với Windows XP, Vista, 7 có thể Ok vì kiến trúc khu vực này Windows không thay đổi.
 
Upvote 0
Nếu công nhân đã thuộc diện không thiết tha với công việc (lương thấp, chế độ không có ...), mà có đuổi việc họ cũng không tiếc như trường hợp của OT, thì khi có được công nhân rồi thì phải chiều họ hết mức. Họ ho một chút là dâng ngay thuốc, thấy mồ hôi là lau ngay cho họ ... Làm gì có chuyện "Muốn gõ tiếng Việt tới chỗ khác". Công nhân mà họ bực lên họ thôi việc thì lại chết.
Em có xem mấy bài trước nên cũng nắm được chỗ này. :)
Ý em chỗ đỏ đỏ là mình làm sao không cho gõ chữ có dấu vào file để scan đó thôi (vì file đó đang dùng code, dùng form, tức là chỉ định file đó làm việc rồi). Những file khác, phần mềm khác gõ bình thường.
 
Upvote 0
Tôi thấy có bạn đề cập đến việc chỉnh sửa code của Unikey nhưng lại ái ngại những vấn đề kỹ thuật phát sinh.
Nếu đã nói đến việc can thiệp vào code nguồn của Unikey thì trước hết phải xét xem tác giả có cho phép không. Sau đó sửa code nguồn chỉ để cho OT dùng. Nếu chỉ phục vụ OT thì dễ rồi. Tổ hợp Ctrl + Shift thì vẫn giữ để chuyển qua lại giữa 2 chế độ. Thêm 1 tổ hợp phím nữa mà nếu Unikey nhận được thì luôn chuyển về chế độ Anh. Tức đang Anh thì không làm gì, ngược lại thì chuyển về Anh. Cái này thì cứ bắt chước code xử lý Ctrl + Shift, chỉ có điều không chuyển qua lại mà luôn chuyển về Anh. Thế thôi. Rồi compile lại code và trang bị cho công nhân của OT. Lúc này công nhân có thêm lựa chọn là nhấn tổ hợp mới thì luôn về Anh, Nếu click hoặc tổ hợp cũ thì luôn chuyển qua lại. Code cũng có 2 lựa chọn là chuyển qua lại - giả nhấn Ctrl + Shift, và chuyển về Anh - giả nhấn tổ hợp mới.
Sửa code nguồn và compile lại là chuyện nhỏ (thêm 1 tổ hợp phím mới) nhưng tôi cho là tác giả không đồng ý.
Bài đã được tự động gộp:

Cách của bác Batman1: Dùng hàm API để lấy Tips của Unikey và so sánh với chuỗi "Click to turn off Vietnamese mode" có vẻ vô phương với Windows 10.
Tôi nhìn Windows 10 thì cũng giật mình ngay vì nó khác XP của tôi.
 
Upvote 0
Nếu đã nói đến việc can thiệp vào code nguồn của Unikey thì trước hết phải xét xem tác giả có cho phép không. Sau đó sửa code nguồn chỉ để cho OT dùng. Nếu chỉ phục vụ OT thì dễ rồi. Tổ hợp Ctrl + Shift thì vẫn giữ để chuyển qua lại giữa 2 chế độ. Thêm 1 tổ hợp phím nữa mà nếu Unikey nhận được thì luôn chuyển về chế độ Anh. Tức đang Anh thì không làm gì, ngược lại thì chuyển về Anh. Cái này thì cứ bắt chước code xử lý Ctrl + Shift, chỉ có điều không chuyển qua lại mà luôn chuyển về Anh. Thế thôi. Rồi compile lại code và trang bị cho công nhân của OT. Lúc này công nhân có thêm lựa chọn là nhấn tổ hợp mới thì luôn về Anh, Nếu click hoặc tổ hợp cũ thì luôn chuyển qua lại. Code cũng có 2 lựa chọn là chuyển qua lại - giả nhấn Ctrl + Shift, và chuyển về Anh - giả nhấn tổ hợp mới.
Sửa code nguồn và compile lại là chuyện nhỏ (thêm 1 tổ hợp phím mới) nhưng tôi cho là tác giả không đồng ý.
Unikey vốn là nguồn mở mà chú. Tác giả cũng phải cóp nhặn từ nhiều nguồn mới tạo nên nó điển hình nhất là ban đầu nó lấy dll của một người Tây. Thứ nữa là Ctrl + Shift nằm trong khá nhiều bộ phím tắt của nhiều ứng dụng nên có khi vô tình tắt/mở Unikey mà không hay. Cháu toàn cài Alt+Z thôi vì bộ phím này rất ít dùng trong ứng dụng khác. Nếu giải quyết triệt để theo ý cháu thì sẽ tránh được nhiều phát sinh tương tự .
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom