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,213
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:
Sao phải khổ vậy???
Nó viết ra cái phần mềm như vậy mà không có phím tắt tự chuyển hay sao phải xài tới Với Ba Anh vậy?

Ctrl+Shift qua lại E/V
 
Upvote 0
Sao phải khổ vậy???
Nó viết ra cái phần mềm như vậy mà không có phím tắt tự chuyển hay sao phải xài tới Với Ba Anh vậy?

Ctrl+Shift qua lại E/V
Xin chào hpkhuong, cảm ơn bạn đã quan tâm ạ.
Đúng là rất khổ nên mới phải vậy ạ :)
Là như thế này ạ, có một máy tính chuyên để cho công nhân kiểm tra hàng đầu vào và đầu ra nếu unikey để chế độ tiếng Việt thì quá trình quyét QR-code sẽ sai lệch nên phải tắt unikey hoặc để tiếng Anh.
Các tổ trưởng đã dặn dò công nhân nhiều lần nhưng khổ thật vẫn không triệt để được :)
 
Upvote 0
Xin chào hpkhuong, cảm ơn bạn đã quan tâm ạ.
Đúng là rất khổ nên mới phải vậy ạ :)
Là như thế này ạ, có một máy tính chuyên để cho công nhân kiểm tra hàng đầu vào và đầu ra nếu unikey để chế độ tiếng Việt thì quá trình quyét QR-code sẽ sai lệch nên phải tắt unikey hoặc để tiếng Anh.
Các tổ trưởng đã dặn dò công nhân nhiều lần nhưng khổ thật vẫn không triệt để được :)
Cùng nỗi khổ, như mình máy nào phải quét cái này là chuyển nó luôn sang Dạng EN luôn hoặc exit Unikey luôn !
 
Upvote 0
Cùng nỗi khổ, như mình máy nào phải quét cái này là chuyển nó luôn sang Dạng EN luôn hoặc exit Unikey luôn !
OT đang loay hoay với code sau nhưng đang ngược lại thì phải,, đang muốn close thì cái này lại open T_T
Mã:
Option Explicit
'https://www.mrexcel.com/forum/excel-questions/55650-close-application-vba.html#post258035
'// used to find the Winwedge Window
Private Declare Function FindWindow _
Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) _
As Long

'// used to CLOSE the Winwedge App
Private Declare Function PostMessage _
Lib "user32" _
Alias "PostMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) _
As Long

Private Const WM_CLOSE = &H10

Sub TesterClose()
Dim lngRet As Long
Dim Pid As Long
Dim Winwedgehdl As Long

Shell "C:\Program Files\UniKey\UniKeyNT.exe" '"C:\program files\winwedge.exe"

Winwedgehdl = FindWindow(vbNullString, "The name as it appears in your App Title")
PostMessage Winwedgehdl, WM_CLOSE, 0&, 0&

End Sub
 
Upvote 0
Xin chào hpkhuong, cảm ơn bạn đã quan tâm ạ.
Đúng là rất khổ nên mới phải vậy ạ :)
Là như thế này ạ, có một máy tính chuyên để cho công nhân kiểm tra hàng đầu vào và đầu ra nếu unikey để chế độ tiếng Việt thì quá trình quyét QR-code sẽ sai lệch nên phải tắt unikey hoặc để tiếng Anh.
Các tổ trưởng đã dặn dò công nhân nhiều lần nhưng khổ thật vẫn không triệt để được :)

Tôi cho bạn một chìa khóa để giải quyết. Đừng làm gì đến Unikey vì dù bạn có làm được thì cũng gian nan và mất thời gian chưa chắc đã ổn định.
Hãy sửa phần mềm quét QR code. Nguyễn lý các thiết bị quét mã vạch là có lệnh ENTER cuối cùng. Phần mềm hãy bắt sự kiện KeyDown với keycode = 13 thì mới cho chạy lệnh nhập dữ liệu.
 
Upvote 0
Tôi cho bạn một chìa khóa để giải quyết. Đùng làm gì đến Unikey vì dù bạn có làm được thì cũng gian nan và mất thời gian chưa chắc đã ổn định.
Hãy sửa phần mềm quét QR code. Nguyễn lý các thiết bị quét mã vạch là có lệnh ENTER cuối cùng. Phần mềm hãy bắt sự kiện KeyDown với keycode = 13 thì mới cho chạy lệnh nhập dữ liệu.
Cảm ơn anh @Nguyễn Duy Tuân đã góp ý ạ, OT không sử dụng form để lấy QR-Code mà đặt con trỏ trực tiếp trên range để cho máy quet tự động truyền dữ liệu vào bảng tính.
 
Upvote 0
Cảm ơn anh @Nguyễn Duy Tuân đã góp ý ạ, OT không sử dụng form để lấy QR-Code mà đặt con trỏ trực tiếp trên range để cho máy quet tự động truyền dữ liệu vào bảng tính.

Dùng QR code hãy tạo Userform. Nó rất đơn giản mà lại an toàn. Đặc biệt bạn giao file Excel này cho công nhân dùng. Việc bạn điều khiển Unikey là rất khó và nhiều rủi ro đấy, không phải ai cũng code API một cách mượt mà đâu.
 
Upvote 0
Dùng QR code hãy tạo Userform. Nó rất đơn giản mà lại an toàn. Đặc biệt bạn giao file Excel này cho công nhân dùng. Việc bạn điều khiển Unikey là rất khó và nhiều rủi ro đấy, không phải ai cũng code API một cách mượt mà đâu.

Nếu đơn giản và không phiền Anh có thể code cho OT xin 1 form với tính năng: khi mở Form lên QR-Code sẽ ghi dữ liệu vào From này sau đó kết thúc bấm nút OK thì toàn bộ dữ liệu trên Form sẽ được ghi xuống range bắt đầu từ ô "A1" của "sheet1" được không ạ.
Cảm ơn anh nhiều ạ.
 
Upvote 0
Để đóng hoàn toàn Unikey thì đơn giản thế này thôi.
Ruby:
Sub t()
    Shell "taskkill /f /t /im unikeynt.exe"
End Sub
Xui xẻo là cái ông đẻ ra chữ quốc ngữ là người Pháp chứ nếu ổng là người Anh hay Mỹ thì đây sẽ là câu trên băng rôn đầu năm "chook moong nahm moi"--=0 Và đời đời con cháu chúng ta chả bao h cảm thấy phiền toái với dấu theo kiểu ký âm tiếng Việt kiểu tây pha tạp.
 
Lần chỉnh sửa cuối:
Upvote 0
Để đóng hoàn toàn Unikey thì đơn giản thế này thôi.
Ruby:
Sub t()
    Shell "taskkill /f /t /im unikeynt.exe"
End Sub
Xui xẻo là cái ông đẻ ra chữ quốc ngữ là người Pháp chứ nếu ổng là người Anh hay Mỹ thì đây sẽ là câu trên băng rôn đầu năm "chook moong nahm moi"--=0 Và đời đời con cháu chúng ta chả bao h cảm thấy phiền toái với dấu theo kiểu ký âm tiếng Việt kiểu tây pha tạp.
Hi, cảm ơn bạn nhiều ạ.
Hiện OT đang không ngồi máy, có vấn đề gì OT sẽ thông tin lại sau ạ.
 
Upvote 0
Nếu đơn giản và không phiền Anh có thể code cho OT xin 1 form với tính năng: khi mở Form lên QR-Code sẽ ghi dữ liệu vào From này sau đó kết thúc bấm nút OK thì toàn bộ dữ liệu trên Form sẽ được ghi xuống range bắt đầu từ ô "A1" của "sheet1" được không ạ.
Cảm ơn anh nhiều ạ.

Bạn đợi chút tôi sẽ làm cho bạn tình huống này bằng VBA với Userform. Nhưng đúng là vấn đề của bạn là vấn đề chung với mọi phần mềm quét mã vạch đấy.
 
Upvote 0
Tôi không dùng Unikey nên không theo dõi. Không biết qua nhiều phiên bản thì có thay đổi gì không, nhưng tôi nhớ là hồi xưa tò mò thì biết Unikey có cửa sổ với lớp là "Unikey MainWnd" nên nếu bạn tò mò thì thử code ở sau.

Nhưng giải quyết như Tuân đề xuất tôi nghĩ là hợp lý. Vậy muốn làm việc thì như Tuân đề xuất. Khi nghỉ giải lao thì vọc chơi để thư giãn. :D

1. Giả nhấn Ctrl + Shift
Mã:
Option Explicit

Private Const VK_CONTROL As Long = &H11
Private Const VK_SHIFT As Long = &H10
Private Const KEYEVENTF_KEYUP As Long = &H2

#If VBA7 Then
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
#Else
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Sub change_keyboard()
    keybd_event VK_CONTROL, 0, 0, 0
    keybd_event VK_SHIFT, 0, 0, 0
    keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
End Sub
Nhưng cách này không dùng được. Cái này chỉ là chuyển qua lại giữa 2 bàn phím. Nếu người ta đang có bàn phím Anh mà lại chạy code thì thành ra bàn phím Việt. Như thế là đang có lợn lành lại chữa thành lợn què :D

2. Nếu bạn vọc chơi thì thử xem. Nếu class của Unikey có thay đổi trong phiên bản đang dùng thì không có hiệu quả vì hwnd = 0. Tôi chỉ cho bạn cách vọc còn việc nên làm gì để giải quyết vấn đề của bạn thì tôi không bàn.
Mã:
Option Explicit

#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
#Else
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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
#End If

Private Const WM_CLOSE As Long = &H10

Sub test_message()
#If VBA7 Then
    Dim hwnd As LongPtr
#Else
    Dim hwnd As Long
#End If
    hwnd = FindWindow("Unikey MainWnd", vbNullString)
    PostMessage hwnd, WM_CLOSE, 0, 0
End Sub
 
Upvote 0
Bạn đợi chút tôi sẽ làm cho bạn tình huống này bằng VBA với Userform. Nhưng đúng là vấn đề của bạn là vấn đề chung với mọi phần mềm quét mã vạch đấy.

Xin lỗi là tôi đã thử làm nhưng phát sinh nhiều tình huống và chưa ra được :). Vụ này không dễ tí nào với tôi :)
 
Upvote 0
Để đóng hoàn toàn Unikey thì đơn giản thế này thôi.
Ruby:
Sub t()
    Shell "taskkill /f /t /im unikeynt.exe"
End Sub
Xui xẻo là cái ông đẻ ra chữ quốc ngữ là người Pháp chứ nếu ổng là người Anh hay Mỹ thì đây sẽ là câu trên băng rôn đầu năm "chook moong nahm moi"--=0 Và đời đời con cháu chúng ta chả bao h cảm thấy phiền toái với dấu theo kiểu ký âm tiếng Việt kiểu tây pha tạp.

Cảm ơn bạn code chạy có đóng unikey ạ, nhưng sau khi chạy code phải chỉ vào biểu tượng unikey ở gói phải của thanh taskbar thì nó mới mất biểu tượng ạ


Tôi không dùng Unikey nên không theo dõi. Không biết qua nhiều phiên bản thì có thay đổi gì không, nhưng tôi nhớ là hồi xưa tò mò thì biết Unikey có cửa sổ với lớp là "Unikey MainWnd" nên nếu bạn tò mò thì thử code ở sau.

Nhưng giải quyết như Tuân đề xuất tôi nghĩ là hợp lý. Vậy muốn làm việc thì như Tuân đề xuất. Khi nghỉ giải lao thì vọc chơi để thư giãn. :D

1. Giả nhấn Ctrl + Shift
Mã:
Option Explicit

Private Const VK_CONTROL As Long = &H11
Private Const VK_SHIFT As Long = &H10
Private Const KEYEVENTF_KEYUP As Long = &H2

#If VBA7 Then
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr)
#Else
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Sub change_keyboard()
    keybd_event VK_CONTROL, 0, 0, 0
    keybd_event VK_SHIFT, 0, 0, 0
    keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
End Sub
Nhưng cách này không dùng được. Cái này chỉ là chuyển qua lại giữa 2 bàn phím. Nếu người ta đang có bàn phím Anh mà lại chạy code thì thành ra bàn phím Việt. Như thế là đang có lợn lành lại chữa thành lợn què :D

2. Nếu bạn vọc chơi thì thử xem. Nếu class của Unikey có thay đổi trong phiên bản đang dùng thì không có hiệu quả vì hwnd = 0. Tôi chỉ cho bạn cách vọc còn việc nên làm gì để giải quyết vấn đề của bạn thì tôi không bàn.
Mã:
Option Explicit

#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
#Else
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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
#End If

Private Const WM_CLOSE As Long = &H10

Sub test_message()
#If VBA7 Then
    Dim hwnd As LongPtr
#Else
    Dim hwnd As Long
#End If
    hwnd = FindWindow("Unikey MainWnd", vbNullString)
    PostMessage hwnd, WM_CLOSE, 0, 0
End Sub
Con cảm ơn Bác Siwtom, 2 code trên của Bác chạy trên nền Win10 đều OK ạ. đúng là sub change_keyboard không sử dụng được vì không biết lúc nào Unikey đang ở chế độ Anh hay Việt. Còn sub test_message chạy OK ,run cái biểu tượng mất luôn ngay lập tức ạ.

Bạn đợi chút tôi sẽ làm cho bạn tình huống này bằng VBA với Userform. Nhưng đúng là vấn đề của bạn là vấn đề chung với mọi phần mềm quét mã vạch đấy.
Xin lỗi là tôi đã thử làm nhưng phát sinh nhiều tình huống và chưa ra được :). Vụ này không dễ tí nào với tôi :)
Oanh Thơ (OT)xin cảm ơn anh Nguyễn Duy Tuân nhiều ạ, trong khi chờ đợi:
userform với tính năng: khi mở Form lên QR-Code sẽ ghi dữ liệu vào From này sau đó kết thúc bấm nút OK thì toàn bộ dữ liệu trên Form sẽ được ghi xuống range bắt đầu từ ô "A1" của "sheet1"
OT có thể sử dụng sub test_message ạ.

Theo kinh nghiệm của anh và được sự góp ý nên OT lại háo hức muốn sử dụng userform để đảm bảo an toàn tránh rủi ro ạ, vì có thể ngoài Unikey ra còn các ứng dụng khác nữa như VietKey chẳng hạn.

Một lần nữa xin cảm ơn Bác/Anh và các bạn đã giúp đỡ ạ.
Oanh Thơ
 
Upvote 0
Cảm ơn bạn code chạy có đóng unikey ạ, nhưng sau khi chạy code phải chỉ vào biểu tượng unikey ở gói phải của thanh taskbar thì nó mới mất biểu tượng ạ



Con cảm ơn Bác Siwtom, 2 code trên của Bác chạy trên nền Win10 đều OK ạ. đúng là sub change_keyboard không sử dụng được vì không biết lúc nào Unikey đang ở chế độ Anh hay Việt. Còn sub test_message chạy OK ,run cái biểu tượng mất luôn ngay lập tức ạ.



Oanh Thơ (OT)xin cảm ơn anh Nguyễn Duy Tuân nhiều ạ, trong khi chờ đợi:

OT có thể sử dụng sub test_message ạ.

Theo kinh nghiệm của anh và được sự góp ý nên OT lại háo hức muốn sử dụng userform để đảm bảo an toàn tránh rủi ro ạ, vì có thể ngoài Unikey ra còn các ứng dụng khác nữa như VietKey chẳng hạn.

Một lần nữa xin cảm ơn Bác/Anh và các bạn đã giúp đỡ ạ.
Oanh Thơ
Không rõ máy scan QR-CODE của chỗ bạn sao
Còn bình thường thì cứ form với textbox và xét textbox_change là được, cứ thử xem sao
 
Upvote 0
Không rõ máy scan QR-CODE của chỗ bạn sao
Còn bình thường thì cứ form với textbox và xét textbox_change là được, cứ thử xem sao
Cảm ơn bạn đã quan tâm, OT cũng chưa bao giờ thử với user form nhưng qua tìm hiểu OT biết đa phần là QR-Code sử dụng trên userForm.
Nhưng OT thấy sử dụng trực tiếp trên bảng tính vẫn được nhưng vướng bộ gõ tiếng việt, hoặc trong trường hợp một công nhân đang kiểm tra sản phẩm còn 1 công nhân khác thao tác máy tính chỉ chuột ra địa điểm khác v.v... thì lại thấy bất cập nên muốn quay sang sử dụng userForm theo gợi ý của anh Nguyễn Duy Tuân.
Ý tưởng của OT mong muốn khi thực hiện kiểm tra QR-Code sẽ gọi userForm lên rồi mới thao tác quet và trong quá trình quét tất cả thông tin sẽ được lưu trên textbox(listbox) gì đó của form , kết thúc quá trình bấm nút OK trên from để ghi dữ liệu xuống bảng tính., mỗi QR-code là 1 dòng lần lượt từ trên xuống dưới. Nhưng OT chưa làm được việc này vì OT ít khi sử dụng form ạ :rolleyes:
 
Upvote 0
nhưng sau khi chạy code phải chỉ vào biểu tượng unikey ở gói phải của thanh taskbar thì nó mới mất biểu tượng
...
Còn sub test_message chạy OK ,run cái biểu tượng mất luôn ngay lập tức ạ.
Bạn đừng lăn tăn chuyện biểu tượng. Nếu Unikey đã dọn đồ chơi rồi thì biểu tượng chả là gì cả. Cho dù biểu tượng không mất ngay thì còn đâu Unikey để mà bạn gõ?
 
Upvote 0
Bạn đừng lăn tăn chuyện biểu tượng. Nếu Unikey đã dọn đồ chơi rồi thì biểu tượng chả là gì cả. Cho dù biểu tượng không mất ngay thì còn đâu Unikey để mà bạn gõ?
Dạ, vâng Bác, Đó chỉ là ảo giác ạ.
Con chỉ sợ người khác không biết nghĩ thấy vẫn có biểu tượng mà không gõ được tiếng Việt nên sẽ thắc mắc ạ.
Con cảm ơn Bác.
 
Upvote 0
@Nguyễn Hoàng Oanh Thơ
Có nhiều cách để thực hiện tuy nhiên nó đi từ dể cho đến rất khó.

Tôi nghĩ OT nên dùng phương thức thoát chương trình cho đơn giản. Nếu công nhân người thì thích Unikey, người thì VietKey... Thì không cần biết ứng dụng đang bật hay tắt: Vẫn thực hiện thoát hẳn Unikey , VietKey, EVkey , ... , sau khi VBA thực hiện xong sẽ tự động mở lại:
  1. Xem máy tính có đang mở ứng dụng gõ dấu không.
  2. Nếu có thì thực hiện lấy đường dẫn ứng dụng và đồng thời thoát.
  3. Mở lại ứng dụng gõ dấu
 
Upvote 0
Web KT
Back
Top Bottom