Khắc phục [QR-Code] sai do bộ gõ tiếng Việt ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
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
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
Công nhân batman1 luôn luôn viết tiếng Việt bằng bàn phím của Windows. Vậy tôi đề nghị xử lý thêm trường hợp của công nhân batman1. Hoặc xử lý ngay công nhân batman1. Đợt nào có giảm biên chế thì cho nghỉ luôn chẳng hạn :D

Đã xét thì xét tới cùng nhỉ.
 
Lần chỉnh sửa cuối:
Upvote 0
Công nhân batman1 luôn luôn viết tiếng Việt bằng bàn phím của Windows. Vậy tôi đề nghị xử lý thêm trường hợp của công nhân batman1. Hoặc xử lý ngay công nhân batman1. Đợt nào có giảm biên chế thì cho nghỉ luôn chẳng hạn :D

Đã xét thì xét tới cùng nhỉ.
Những gì mặc định trên Window thì có thể dùng Win API , Command Line, Shell,... Nếu sử dụng Python thì bỏ ít công sức để viết Code hơn.
 
Upvote 0
Những gì mặc định trên Window thì có thể dùng Win API , Command Line, Shell,... Nếu sử dụng Python thì bỏ ít công sức để viết Code hơn.

Căn cứ ở đâu trong trường hợp này lại ít công sức khi dùng Python bạn nhỉ? Theo hiểu biết của mình Python chỉ là ngôn ngữ lập trình, mọi logic, giải thuật là do người lập trình., ngôn ngữ lập trình chỉ là diễn tả lại mà thôi. Mà thực sự mình chưa thấy cái ví dụ nào Python thuyết phục hơn VBA ? Bạn có thể cho vài link dẫn chứng đc không?
 
Upvote 0
Những gì mặc định trên Window thì có thể dùng Win API , Command Line, Shell,... Nếu sử dụng Python thì bỏ ít công sức để viết Code hơn.
Bạn nói là dùng Windows API thì làm được tuốt thì tôi cũng phải đồng ý thôi. Ai cũng nói được điều hiển nhiên đó, cả những người chưa từng lập trình Windows API. Vấn đề là làm thế nào. Thế thôi.

Bạn có thể bật mí, cho một code Python cụ thể dùng để chuyển bàn phím trong system không? Vd. trong máy tôi luôn có 3 bàn phím. Mặc định là bàn phím Ba Lan. Những khi tôi cần viết bài lên GPE thì tôi chọn bàn phím Vietnamese. Khi cần thì tôi lại chọn bàn phím Anh. Bạn viết trong Python thế nào để nhập bàn phím vietnamese cho tôi bất luận bàn phím hiện hành thế nào?
 
Upvote 0
Căn cứ ở đâu trong trường hợp này lại ít công sức khi dùng Python bạn nhỉ? Theo hiểu biết của mình Python chỉ là ngôn ngữ lập trình, mọi logic, giải thuật là do người lập trình., ngôn ngữ lập trình chỉ là diễn tả lại mà thôi. Mà thực sự mình chưa thấy cái ví dụ nào Python thuyết phục hơn VBA ? Bạn có thể cho vài link dẫn chứng đc không?
Lý do em nói vậy là vì thế mạnh của Python. Các gói ứng dụng tác vụ xử lý Windows được cộng đồng viết sẵn, mã nguồn đa số mã nguồn mở. Mình có thể sử dụng các gói sẵn có đó + vấn đề mình cần. Mình không phải bỏ công viết lại cả một ứng dụng.
Riêng Python cơ bản cũng đủ thấy sự tiện dụng của nó.

Một vài ví dụ:
1.
Để tách một chuỗi "Giải Pháp Excel":
Python: Chuoi = List("Giải Pháp Excel")
VBA: phải viết một vòng lặp duyệt qua từng ký tự chuỗi
2. Để biết "Excel" có trong Array("Giải", "Pháp", "Excel"):
Python: HasChuoi = "Excel" In ["Giải", "Pháp", "Excel"]
VBA
: phải viết một vòng lặp duyệt qua mảng
3. Python có thể gán trực tiếp vòng lặp:
ArrayChuoi = [x*2 for x in Range(10)]
4. Có thể lấy ra phần tử của chuỗi và mảng nhanh chóng:
ArrayChuoi2 = ArrayChuoi[2 : 6]
và đảo nhanh chóng:
ArrayChuoi3 = ArrayChuoi[6 : 2 : -1]
VBA thì phải viết lại.
5. Python có thể gán trực tiếp một tham số truyền vào:
Math = lambda x: x**2 + 2*x - 5
6. VBA phải viết cả ứng dụng để xử lý dữ liệu Json. Python thì không
7. Python có thể tự thực hiện phân luồng xử lý. VBA phải dựa vào một ngôn ngữ khác
8.
Python có thể lập trình AI , Machine Learning.
9. Python có thể đọc trong tệp .py các ký tự bảng mã Unicode.
VBA
thì chỉ có thể là Á À , Ú Ù, ????
10.
Để tìm kiếm gói Python chỉ cần vào https://pypi.org/, Github, stackoverflow.com. Với VBA thì phải tìm mọi nẻo đường
11. Python có thể nhúng.
12. Python đang phát triển, cộng đồng hỗ trợ. VBA thì lỗi thời
13. ...

Có thể tải gói ứng dụng về sử dụng ngay với Python. VBA thì phải nhiều động tác bằng tay.

Một số gói ứng dụng cực chất được viết cho trong Python:
Gói xử lý ngôn ngữ tự nhiên trong Python là NLTK , NLTK có thể phân tích, liệt kê cả một quyển sách nhanh chóng. Nếu bắt buộc viết lại NLTK trong VBA thì một lập trình viên sẽ "đầu hàng".
Gói OpenCV, TensorFlow,
Gói hệ thống: psutil
...

Trong lập trình WIN API anh phải bỏ công tìm kiếm học WIN API để viết ứng dụng VBA, có khi phải code 80% ứng dụng.
Python thì chỉ việc mượn lại các gói có sẵn của cộng đồng cho ứng dụng của mình.

Trong Python nếu lập trình viên có ý tưởng, thì cộng đồng sẽ hỗ trợ họ. Nếu có ý tưởng với VBA thì tự thân phát triển. Và Lập trình viên VBA không ai muốn chia sẽ ý tưởng với cộng đồng. Python lại rất khác.

sự ra đời của Python cũng giống như sự ra đời ngôn ngữ bậc thấp Visual C C++ để thay thế Assembly , Assembly thay thế Mã máy
 
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện Python:
- có thể tạo 'docstrings' cho UDF;
- tạo Dynamic array (gõ hàm ở một cell và kết quả trả về cả mảng xuống bảng tính) với 1 dòng lệnh (có sẵn thư viện rồi).
 
Upvote 0
Bạn nói là dùng Windows API thì làm được tuốt thì tôi cũng phải đồng ý thôi. Ai cũng nói được điều hiển nhiên đó, cả những người chưa từng lập trình Windows API. Vấn đề là làm thế nào. Thế thôi.

Bạn có thể bật mí, cho một code Python cụ thể dùng để chuyển bàn phím trong system không? Vd. trong máy tôi luôn có 3 bàn phím. Mặc định là bàn phím Ba Lan. Những khi tôi cần viết bài lên GPE thì tôi chọn bàn phím Vietnamese. Khi cần thì tôi lại chọn bàn phím Anh. Bạn viết trong Python thế nào để nhập bàn phím vietnamese cho tôi bất luận bàn phím hiện hành thế nào?
Mặc định Windows. Thì anh có thể sử dụng hướng dẫn trong Docs Microsoft: Set Dislay Language , Set default Language
 
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
Cảm ơn HeSanbi đã quan tâm và góp ý,cái này code sao vậy HeSanbi?

Công nhân batman1 luôn luôn viết tiếng Việt bằng bàn phím của Windows. Vậy tôi đề nghị xử lý thêm trường hợp của công nhân batman1.
.
Dạ, khi nào Bác nghỉ giải lao, Bác giúp con trường hợp trên với ạ.
Hoặc xử lý ngay công nhân batman1. Đợt nào có giảm biên chế thì cho nghỉ luôn chẳng hạn :D
Đã xét thì xét tới cùng nhỉ
Hi, không có sản phẩm của mình thì họ không làm sao, vì có sản phẩm của mình mà họ bị nghỉ thì ác quá Bác nhỉ.
Con cảm ơn Bác.
 
Upvote 0
Cái scanner nó nhập dữ liệu kiểu gõ vô ô phải không nhỉ? Nếu thế dùng validation được không?
Chào bạn, Đúng như thế ạ.Scanner nó nhập dữ liệu từ ô A1:An (trong cột A) , kiểu gõ lần lượt như soạn thảo văn bản (từng từ 1 từ trái sang phải).

Nếu thế dùng validation thì vẫn có thể ngăn được lỗi có dấu này như ví dụ (OT chưa thử ngoài thực tế) chỉ thao tác trên lý thuyết như gõ văn bản.
Nhưng thực tế công nhân khi bắt đầu Scanner họ không ngồi ở máy hay nhìn máy tính đâu ạ mà họ cầm thiết bị Scanner cứ thế quét nên hệ thống có thông báo lỗi hay không lỗi họ cũng không biết ạ.
Vì vậy mà cách này không khả thi ạ.

Cảm ơn bạn nhiều.
 
Upvote 0
Lý do em nói vậy là vì thế mạnh của Python. Các gói ứng dụng tác vụ xử lý Windows được cộng đồng viết sẵn, mã nguồn đa số mã nguồn mở. Mình có thể sử dụng các gói sẵn có đó + vấn đề mình cần. Mình không phải bỏ công viết lại cả một ứng dụng.
Riêng Python cơ bản cũng đủ thấy sự tiện dụng của nó.

Một vài ví dụ:
1.
Để tách một chuỗi "Giải Pháp Excel":
Python: Chuoi = List("Giải Pháp Excel")
VBA: phải viết một vòng lặp duyệt qua từng ký tự chuỗi
2. Để biết "Excel" có trong Array("Giải", "Pháp", "Excel"):
Python: HasChuoi = "Excel" In ["Giải", "Pháp", "Excel"]
VBA
: phải viết một vòng lặp duyệt qua mảng
3. Python có thể gán trực tiếp vòng lặp:
ArrayChuoi = [x*2 for x in Range(10)]
4. Có thể lấy ra phần tử của chuỗi và mảng nhanh chóng:
ArrayChuoi2 = ArrayChuoi[2 : 6]
và đảo nhanh chóng:
ArrayChuoi3 = ArrayChuoi[6 : 2 : -1]
VBA thì phải viết lại.
5. Python có thể gán trực tiếp một tham số truyền vào:
Math = lambda x: x**2 + 2*x - 5
6. VBA phải viết cả ứng dụng để xử lý dữ liệu Json. Python thì không
7. Python có thể tự thực hiện phân luồng xử lý. VBA phải dựa vào một ngôn ngữ khác
8.
Python có thể lập trình AI , Machine Learning.
9. Python có thể đọc trong tệp .py các ký tự bảng mã Unicode.
VBA
thì chỉ có thể là Á À , Ú Ù, ????
10.
Để tìm kiếm gói Python chỉ cần vào https://pypi.org/, Github, stackoverflow.com. Với VBA thì phải tìm mọi nẻo đường
11. Python có thể nhúng.
12. Python đang phát triển, cộng đồng hỗ trợ. VBA thì lỗi thời
13. ...

Có thể tải gói ứng dụng về sử dụng ngay với Python. VBA thì phải nhiều động tác bằng tay.

Một số gói ứng dụng cực chất được viết cho trong Python:
Gói xử lý ngôn ngữ tự nhiên trong Python là NLTK , NLTK có thể phân tích, liệt kê cả một quyển sách nhanh chóng. Nếu bắt buộc viết lại NLTK trong VBA thì một lập trình viên sẽ "đầu hàng".
Gói OpenCV, TensorFlow,
Gói hệ thống: psutil
...

Trong lập trình WIN API anh phải bỏ công tìm kiếm học WIN API để viết ứng dụng VBA, có khi phải code 80% ứng dụng.
Python thì chỉ việc mượn lại các gói có sẵn của cộng đồng cho ứng dụng của mình.

Trong Python nếu lập trình viên có ý tưởng, thì cộng đồng sẽ hỗ trợ họ. Nếu có ý tưởng với VBA thì tự thân phát triển. Và Lập trình viên VBA không ai muốn chia sẽ ý tưởng với cộng đồng. Python lại rất khác.

sự ra đời của Python cũng giống như sự ra đời ngôn ngữ bậc thấp Visual C C++ để thay thế Assembly , Assembly thay thế Mã máy

Nhìn qua một số điểm sáng của ngôn ngữ thì mình thấy đúng là nếu viết code bằng Python sẽ ngắn gọn thật. Có thể nói code của Python sẽ ngắn gọn hơn C, Pascal, Delphi, .NET, VB/VBA (có thể là gần như vậy) . Nhưng đây là vấn đề của ngôn ngữ. Như kiểu người nói tiếng. Anh, người nói tiếng Việt. Công lực vẫn là con người. Hình như Python là không có biên dịch mã máy vì thế các lập trình viên khi tham gia ngôn ngữ nò thì dù có không muốn Open thì cũng phải Open nên theo đánh giá chủ quan của mình thì Python, ngoài vấn đề ngôn ngữ ngắn nó còn là phương tiện thể thực thi các dự án OpenSource mà ai tham gia đều buộc phải Open?

Lập trình VBA do Microsoft phát triển nó can thiệt trực tiếp vào các Object của Application - Excel. MS đã "iểm bùa" cho nhôn ngữ này khi làm việc với VBA ở một số hoàn cảnh tốc độ chạy nhanh hơn bất kẻ ngôn ngữ nào có nhúng với nó. VÍ dụ các bạn làm
Dim Arr
Arr = Range("A1:H10000").Value -> Code này lấy ra mảng giá trị trong vùng A1:H10000

Tôi đã thử vài ngôn ngữ lập trình thì chưa có cái nào nhanh bằng VBA, nhưng khi xử lý các phép toán mà không đụng vào Object của Excel thì VBA đứng thứ bét, vì nó là Script chứ không phải ngôn ngữ biên dịch ra mã máy, và C, Delphi là là đỉnh cao của tốc độ.

Quay về bài toán của bạn OT thì đây là vấn đề hiểm hóc phết. Tôi nói tình huống có thể đa dạng hơn

Trong một Userform, có n textbox: TextBox1, TextBox2,....TextBoxn. Người lập trình quy ước TextBox1 là dùng để nhận barcode, các cái còn lại làm nhiện vụ ghi nhận thêm thông tin. Vậy chỉ khi con trỏ vào TextBox1 thì Unikey mới tắt chế độ gõ tiếng Việt, khi con trỏ nhảy ra khỏi thì lại khôi phục về trạng thái cũ để người ta nhập liệu tư do, đây là vấn đề khó. Nên giải pháp KillTask hay API: WM_CLOSE Unikey sẽ vẫn chưa được tin cậy. Nhưng nếu chỉ quan tâm tắt phéng đi để scan cái đã thì có thể dùng được rồi.
Bài đã được tự động gộp:

Nhân tiện Python:
- có thể tạo 'docstrings' cho UDF;
- tạo Dynamic array (gõ hàm ở một cell và kết quả trả về cả mảng xuống bảng tính) với 1 dòng lệnh (có sẵn thư viện rồi).

Về giải thuật thì gần như bất kể ngôn ngữc lập trình nào cũng làm được điều này. VBA làm lại còn ngắn gọn hơn. Nhưng vấn đề ở chỗ đã có ai code dự án đó chưa chứ bản thân ngôn ngữ nào cũng chắc chắn không có sẵn những thứ gọi là "thủ thuật" riêng của Excel.
 
Lần chỉnh sửa cuối:
Upvote 0
..
Quay về bài toán của bạn OT thì đây là vấn đề hiểm hóc phết. Tôi nói tình huống có thể đa dạng hơn

Trong một Userform, có n textbox: TextBox1, TextBox2,....TextBoxn. Người lập trình quy ước TextBox1 là dùng để nhận barcode, các cái còn lại làm nhiện vụ ghi nhận thêm thông tin. Vậy chỉ khi con trỏ vào TextBox1 thì Unikey mới tắt chế độ gõ tiếng Việt, khi con trỏ nhảy ra khỏi thì lại khôi phục về trạng thái cũ để người ta nhập liệu tư do, đây là vấn đề khó. Nên giải pháp KillTask hay API: WM_CLOSE Unikey sẽ vẫn chưa được tin cậy. Nhưng nếu chỉ quan tâm tắt phéng đi để scan cái đã thì có thể dùng được rồi.
Híc như ý kiến của anh Tuân việc hi vọng sử dụng bằng userForm cũng chưa có giải pháp ạ. T_T
 
Upvote 0
Nhìn qua một số điểm sáng của ngôn ngữ thì mình thấy đúng là nếu viết code bằng Python sẽ ngắn gọn thật. Có thể nói code của Python sẽ ngắn gọn hơn C, Pascal, Delphi, .NET, VB/VBA (có thể là gần như vậy) . Nhưng đây là vấn đề của ngôn ngữ. Như kiểu người nói tiếng. Anh, người nói tiếng Việt. Công lực vẫn là con người. Hình như Python là không có biên dịch mã máy vì thế các lập trình viên khi tham gia ngôn ngữ nò thì dù có không muốn Open thì cũng phải Open nên theo đánh giá chủ quan của mình thì Python, ngoài vấn đề ngôn ngữ ngắn nó còn là phương tiện thể thực thi các dự án OpenSource mà ai tham gia đều buộc phải Open?

ĐỌC BÀI NÀY Mạnh thấy mấy chữ To mà Đen thế kia thì hoc xong viết code mà ko bảo vệ được chính thành quả của mình thì chám lắm
hay viết xong lại phải dùng 1 Tools của bên thứ 3 thứ 4 gì đó Bill nó lại xong mới cho ai đó xài thấy mất công quá

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run -0-0-0--0-0-0-
 
Upvote 0
ĐỌC BÀI NÀY Mạnh thấy mấy chữ To mà Đen thế kia thì hoc xong viết code mà ko bảo vệ được chính thành quả của mình thì chám lắm
hay viết xong lại phải dùng 1 Tools của bên thứ 3 thứ 4 gì đó Bill nó lại xong mới cho ai đó xài thấy mất công quá

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run -0-0-0--0-0-0-

Vì mọi người ca ngợi PyThon có cộng đồng mở mà - Đây cũng là điểm tích cực. Chỉ cần có ý tưởng thì cả cộng đồng cùng phát triển nên Pythone như một "luật" của cuộc chơi này :D .
Bài đã được tự động gộp:

Híc như ý kiến của anh Tuân việc hi vọng sử dụng bằng userForm cũng chưa có giải pháp ạ. T_T

Userform trong trường hợp của em làm tốt nhất rồi. Nhưng còn lại là vấn đề chấp nhận nó ở ngưỡng nào thôi.
 
Upvote 0
Vì mọi người ca ngợi PyThon có cộng đồng mở mà - Đây cũng là điểm tích cực. Chỉ cần có ý tưởng thì cả cộng đồng cùng phát triển nên Pythone như một "luật" của cuộc chơi này :D .
Bài đã được tự động gộp:


Userform trong trường hợp của em làm tốt nhất rồi. Nhưng còn lại là vấn đề chấp nhận nó ở ngưỡng nào thôi.
Hi, anh Tuân có thể gửi cho Oanh Thơ xin cái Userform này được không ạ. Trong quá trình thử nghiệm phát sinh ở đâu thì lại xử lý tiếp ở đó ạ.
Cảm ơn anh ạ.
 
Upvote 0
Hi, anh Tuân có thể gửi cho Oanh Thơ xin cái Userform này được không ạ. Trong quá trình thử nghiệm phát sinh ở đâu thì lại xử lý tiếp ở đó ạ.
Cảm ơn anh ạ.

Mình định làm theo hướng như đã nói nhưng không được. Bạn có thể dùng theo cách tắt tự động UniKey (không quan tâm đến việc mở lại) thì dùng kiểu Killtask hay API: WM_CLOSE ở các bài trên là được. Nếu bạn khó khăn về việc đưa vào Userform thì tôi có thể làm.
 
Upvote 0
Mặc định Windows. Thì anh có thể sử dụng hướng dẫn trong Docs Microsoft: Set Dislay Language , Set default Language
Thứ nhất tôi không hỏi về mặc định. Mấy cái thiết lập trong CP thì ai chả biết. Tôi hỏi rất cụ thể: tôi chọn liên tục bàn phím Ba Lan, vietnamese, Anh để viết. Trong thời điểm bất kỳ tôi muốn code của bạn chọn bàn phím Anh bất luận ở thời điểm đó tôi đang có bàn phím nào. Thứ hai là tôi muốn nhờ code Python vì bạn nói có thể làm gọn hơn.
 
Upvote 0
ĐỌC BÀI NÀY Mạnh thấy mấy chữ To mà Đen thế kia thì hoc xong viết code mà ko bảo vệ được chính thành quả của mình thì chám lắm
hay viết xong lại phải dùng 1 Tools của bên thứ 3 thứ 4 gì đó Bill nó lại xong mới cho ai đó xài thấy mất công quá

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run -0-0-0--0-0-0-

phải cho người khác xem thì người ta mới cho mình xem chứ , ấy là học hỏi lẫn nhau ^^

Bạn nói là dùng Windows API thì làm được tuốt thì tôi cũng phải đồng ý thôi. Ai cũng nói được điều hiển nhiên đó, cả những người chưa từng lập trình Windows API. Vấn đề là làm thế nào. Thế thôi.
theo em thì assembly mới là làm đc tuốt !^^
 
Lần chỉnh sửa cuối:
Upvote 0
Mình định làm theo hướng như đã nói nhưng không được. Bạn có thể dùng theo cách tắt tự động UniKey (không quan tâm đến việc mở lại) thì dùng kiểu Killtask hay API: WM_CLOSE ở các bài trên là được. Nếu bạn khó khăn về việc đưa vào Userform thì tôi có thể làm.
Dạ vâng, ý tưởng của Anh dùng form để lấy QR_code (thì sẽ an toàn và không rủi ro do bộ gõ) nên OT cũng tò mò muốn kiểm nghiệm ạ..xuất phát từ ý tưởng của Anh nên OT nghĩ chỉ là đưa QR-Code vào 1 textbox trong Form(mỗi QR-Code 1 dòng) sau khi kết thúc xong sẽ đưa toàn bộ dữ liệu trong Form xuống bảng tính mỗi dòng trong textbox ghi vào 1 ô trên bảng tính lần lượt từ ô A1:An.Lấy Form làm trung gian nhận QR-Code thay vì ghi thẳng vào bảng tính.
Theo kinh nghiệm của anh hiện tại vấn đề OT thắc mắc đang là tình hình chung nên có thể sẽ có nhiều người quan tâm. Vì vậy mà OT vẫn đang hi vọng có một hướng khác sử dụng Form theo hướng anh Tuân đã nêu ạ.
Cảm ơn Anh nhiều ạ.
 
Upvote 0
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ạn thử xem được không.
Hoạt động của bộ gõ tiếng Việt rất phức tạp (ít nhất là đối với Unikey trên máy tôi). Tôi mới chỉ chạy thử khi nhập từ bàn phím với Unikey và máy của tôi thôi, không biết trên máy khác và/hoặc bộ gõ khác và khi scan barcode thì như thế nào.
Code trong file đính kèm hoạt động theo cơ chế nhận Keycode của sự kiện KeyUp, loại bỏ Keycode của Unikey và chuyển Keycode về ký tự.
 

File đính kèm

Upvote 0
Thứ nhất tôi không hỏi về mặc định. Mấy cái thiết lập trong CP thì ai chả biết. Tôi hỏi rất cụ thể: tôi chọn liên tục bàn phím Ba Lan, vietnamese, Anh để viết. Trong thời điểm bất kỳ tôi muốn code của bạn chọn bàn phím Anh bất luận ở thời điểm đó tôi đang có bàn phím nào. Thứ hai là tôi muốn nhờ code Python vì bạn nói có thể làm gọn hơn.
Trong Python rất nhiều thư viện, nhiều gói nên anh chớ bận tâm: locale Python
 
Upvote 0
cái này code sao vậy HeSanbi?
PHP:
Sub test_GetVNkeyPath()
  Dim sPath$, ItsMe As Boolean
  ItsMe = GetVNkeyPath(sPath$)
  Debug.Print ItsMe, sPath$
  Application.Wait Now + TimeSerial(0, 0, 3)
  shell sPath
End Sub
    Function GetVNkeyPath(Optional ByRef sPath$) As Boolean
        Dim objProcess As Object, intError&, dArr()
        dArr = Array("unikeynt.exe", "vietkey.exe", "evkey32.exe", "evkey64.exe")
        For Each objProcess In GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
                                                    .ExecQuery("select * from win32_process")
            If InStr(1, vbCr & Join(dArr, vbCr) & vbCr, vbCr & LCase$(objProcess.Name) & vbCr) Then
                On Error Resume Next
                intError = objProcess.Terminate
                If intError = 0 Then
                  sPath$ = objProcess.ExecutablePath 'objProcess.CommandLine
                  GetVNkeyPath = True: Exit For
                End If
            End If
        Next
    End Function


Quay về bài toán của bạn OT thì đây là vấn đề hiểm hóc phết. Tôi nói tình huống có thể đa dạng hơn
Hóc búa thì anh có thể tìm giải pháp: Quét mã vạch / QRCode với C++ và OpenCV và ZBar
Đây là đoạn mã dịch QR Code trong Python:
Python:
from pyzbar.pyzbar import decode
from PIL import Image
decode(Image.open('.../code.png'))

Nói thêm một kỹ thuật gán giữa Python và VBA anh sẽ thấy sự ngắn gọn dễ hiểu của Python:
Python:
ValueM , ValueN= 1 , 2
ValueM , ValueN = ValueN, ValueM
Xử lý Dictionary tốt hơn VBA
VBA:
Dim ValueM , ValueN
ValueM = 1: ValueN = 2
Dim TrungGian
TrungGian = ValueM
ValueM=ValueN : ValueN = TrungGian
 
Lần chỉnh sửa cuối:
Upvote 0
Về giải thuật thì gần như bất kể ngôn ngữc lập trình nào cũng làm được điều này. VBA làm lại còn ngắn gọn hơn. Nhưng vấn đề ở chỗ đã có ai code dự án đó chưa chứ bản thân ngôn ngữ nào cũng chắc chắn không có sẵn những thứ gọi là "thủ thuật" riêng của Excel.
Mấy nội dung em nói ở bài #26 nằm hết trong file đính kèm, anh xem trong đó có gì hay không..
 

File đính kèm

Upvote 0
Bạn thử xem được không.
Hoạt động của bộ gõ tiếng Việt rất phức tạp (ít nhất là đối với Unikey trên máy tôi). Tôi mới chỉ chạy thử khi nhập từ bàn phím với Unikey và máy của tôi thôi, không biết trên máy khác và/hoặc bộ gõ khác và khi scan barcode thì như thế nào.
Code trong file đính kèm hoạt động theo cơ chế nhận Keycode của sự kiện KeyUp, loại bỏ Keycode của Unikey và chuyển Keycode về ký tự.
Cảm ơn anh Hữu Thắng, Code trong form hoạt động tốt ạ,đây là kết quả test ạ bằng thiết vị scanner ạ.
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính vậy anh?
 
Upvote 0
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính
Đơn giản vậy thôi à. Tôi tưởng cơ chế phức tạp hơn:
Khi quét mã xong sẽ Ghi vào Excel. Nếu mã trùng với dữ liệu thì lấy dữ liệu tương ứng cho vào cột sau. Cột tiếp theo,nếu nhập vào Form ghi chú thì ghi chú sẽ nhập ở cột thứ 3 khi bắt Event nghe được ấn Enter.
PHP:
Private Sub TextBox1_Change()
  Dim LastRow&
  LastRow = Range("B" & Rows.Count).End(xlUp).Row
  Range("B" & LastRow + 1) = TextBox1.Value
  'TextBox1.Value = vbNullString
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh Hữu Thắng, Code trong form hoạt động tốt ạ,đây là kết quả test ạ bằng thiết vị scanner ạ.
Bây giờ làm thế nào cứ quét xong 1 QR-Code thì thông tin trong textbox sẽ ghi xuống từng ô trên bảng tính giống như quét trực tiếp trên bảng tính vậy anh?
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
 

File đính kèm

Upvote 0
phải cho người khác xem thì người ta mới cho mình xem chứ , ấy là học hỏi lẫn nhau ^^
^
Thì cũng tùy có cái nên cho ... có cái thì ko cho ... chính vì vậy mới phân biệt được cái nọ cái kia ===\.-0-0-0--0-0-0--0-0-0--0-0-0-
mà sao bác bill ko cho hết đi nhỉ ... cất dấu làm chi không biết ????!!!! mà cái thư viên Hàm Đồ sộ đó của Bác Bill vẫn cho xài thoải mái đó chi ???
 
Upvote 0
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
Bổ sung: Bạn thử cả trường hợp Caplock bật và tắt nhé. Code viết cho việc nhập từ bàn phím nên có tính đến trạng thái của Caplock, cơ chế của máy quét có thể khác.
 
Upvote 0
VBA ở một số hoàn cảnh tốc độ chạy nhanh hơn bất kẻ ngôn ngữ nào có nhúng với nó. VÍ dụ các bạn làm
Dim Arr
Arr = Range("A1:H10000").Value -> Code này lấy ra mảng giá trị trong vùng A1:H10000
Không biết anh có hiểu nhầm gì đó không. Theo em nghĩ VBA thông qua C++ để lấy dữ liệu trên bảng tính sau khi xử lý dữ liệu xong lại thông qua C++ để ghi vào bảng tính. Vì VBA là độc lập, nó chỉ bổ trợ cho Excel.
Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước. Mọi việc sau này VBA phải thông qua C++ để thực hiện.
Excel được viết bằng C++ và C# phải không anh!

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run
Chắc anh sợ rơi ý tưởng vào tay của người khác. "Và gặp nguy hiểm"
 
Lần chỉnh sửa cuối:
Upvote 0
Như bạn có đề cập, tôi làm cho bạn 2 lựa chọn: Ghi trực tiếp xuống sheet hoặc ghi vào listbox sau đó mới ghi xuống sheet 1 lần. Bạn tìm đoạn tôi ghi chú và xóa bớt đoạn code bạn không chọn.
Lưu ý: Bạn nên test kỹ trước khi đưa vào áp dụng vì tôi chỉ code trên những gì tôi nghĩ chứ không có điều kiện thực nghiệm. Bạn hãy thử với tất cả các ký tự bao gồm cả số và các ký tự khác, trong code có khai báo các ký tự được chấp nhận - đó là theo các ký tự trên bàn phím của tôi thực tế có thể có ký tự mà bàn phím của tôi không có.
Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.
Bổ sung: Bạn thử cả trường hợp Caplock bật và tắt nhé. Code viết cho việc nhập từ bàn phím nên có tính đến trạng thái của Caplock, cơ chế của máy quét có thể khác.
Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
 
Upvote 0
Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.

Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
Vậy thì không xét Caplock nữa thôi.
--
À tôi nhầm. Đây lỗi thuật toán, tôi sẽ sửa lại cho bạn.
Bài đã được tự động gộp:

Xin chào anh Hữu Thắng,
Code trong form đã xử lý được trường hợp bộ gõ tiếng Việt.

Nhưng trường hợp Caplock thì lỗi ạ. OT gửi kết quả test nhờ anh xem giúp ạ.
Cảm ơn Anh.
Bạn thử file này xem.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Vậy thì không xét Caplock nữa thôi.
--
À tôi nhầm. Đây lỗi thuật toán, tôi sẽ sửa lại cho bạn.
Bài đã được tự động gộp:

Bạn thử file này xem.
Anh Hữu Thắng ơi, OT cảm ơn anh ạ.
OT đã test thử code trong 2 file.
Trường hợp lỗi xuất hiện các ký tự đặc biệt khi bật Capslock đã được xử lý ạ và trường hợp này giống với trường hợp khi OT test trực tiếp trên sheet không cần qua Form như video trên.

Nhưng vấn đề OT đang hiểu trong trường hợp xử lý lỗi liên quan đến vấn đề Capslock ở đây là nếu có bật hay tắt caplock thì QR-Code cũng không thay đổi. Cụ thể ví dụ trong video trên: QR-Code đang là chữ "YR" nếu bật caplock trong trường hợp thông qua Form hay trực tiếp trên Sheet thì nó tự chuyển thành chữ thường "yr"...
Có cách nào khắc phục giống như chế độ tắt CapsLock đi không ạ?
chữ "YR" nhận vào máy tính không thay đổi hoặc nếu QR-Code là "Aa" thì dù bật caplock thông tin ghi nhận vào máy tính vẫn là "Aa" tương tự trường hợp anh đã xử lý chế độ bật bộ gõ tiếng Việt ạ.
---
Oanh Thơ xin phép sửa lại tiêu đề ạ.
 
Upvote 0
Anh Hữu Thắng ơi, OT cảm ơn anh ạ.
OT đã test thử code trong 2 file.
Trường hợp lỗi xuất hiện các ký tự đặc biệt khi bật Capslock đã được xử lý ạ và trường hợp này giống với trường hợp khi OT test trực tiếp trên sheet không cần qua Form như video trên.

Nhưng vấn đề OT đang hiểu trong trường hợp xử lý lỗi liên quan đến vấn đề Capslock ở đây là nếu có bật hay tắt caplock thì QR-Code cũng không thay đổi. Cụ thể ví dụ trong video trên: QR-Code đang là chữ "YR" nếu bật caplock trong trường hợp thông qua Form hay trực tiếp trên Sheet thì nó tự chuyển thành chữ thường "yr"...
Có cách nào khắc phục giống như chế độ tắt CapsLock đi không ạ?
chữ "YR" nhận vào máy tính không thay đổi hoặc nếu QR-Code là "Aa" thì dù bật caplock thông tin ghi nhận vào máy tính vẫn là "Aa" tương tự trường hợp anh đã xử lý chế độ bật bộ gõ tiếng Việt ạ.
---
Oanh Thơ xin phép sửa lại tiêu đề ạ.
Tôi tưởng bạn muốn giống y hệt như khi scan trực tiếp không dùng code.
Nếu muốn loại bỏ ảnh hưởng của Caplock thì dễ hơn nữa, không cần xét Caplock. Khi nào sử dụng máy tính tôi sẽ sửa lại giúp bạn.
Hoặc bạn có thể tự sửa, Xóa đoạn If... Then bCap = Not bShift ... Else bCap = bShift và thay bằng bCap = bShift (tôi nhớ mang máng như vậy, nếu đúng thì xóa luôn khai báo hàm API vì không cần dùng)
 
Upvote 0
Tôi tưởng bạn muốn giống y hệt như khi scan trực tiếp không dùng code.
Nếu muốn loại bỏ ảnh hưởng của Caplock thì dễ hơn nữa, không cần xét Caplock. Khi nào sử dụng máy tính tôi sẽ sửa lại giúp bạn.
Hoặc bạn có thể tự sửa, Xóa đoạn If... Then bCap = Not bShift ... Else bCap = bShift và thay bằng bCap = bShift (tôi nhớ mang máng như vậy, nếu đúng thì xóa luôn khai báo hàm API vì không cần dùng)
Dạ, vâng khi nào anh ngồi máy anh sửa giúp OT trường hợp này với ạ.
Cảm ơn anh Hữu Thắng.
 
Upvote 0

File đính kèm

Upvote 0
Bạn thử lại với file này.
Nhân tiện, tiêu đề có lẽ nên nói nguyên nhân là do bộ gõ tiếng Việt hoặc Unikey thì mới rõ.
Dạ, làm phiền anh Hữu Thắng rồi.
Về kết quả sang tuần đến cơ quan OT sẽ test thử rồi thông tin lại ở đây ạ.
Cảm ơn anh Hữu Thắng.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhìn qua một số điểm sáng của ngôn ngữ thì mình thấy đúng là nếu viết code bằng Python sẽ ngắn gọn thật. Có thể nói code của Python sẽ ngắn gọn hơn C, Pascal, Delphi, .NET, VB/VBA (có thể là gần như vậy) . Nhưng đây là vấn đề của ngôn ngữ. Như kiểu người nói tiếng. Anh, người nói tiếng Việt. Công lực vẫn là con người. Hình như Python là không có biên dịch mã máy vì thế các lập trình viên khi tham gia ngôn ngữ nò thì dù có không muốn Open thì cũng phải Open nên theo đánh giá chủ quan của mình thì Python, ngoài vấn đề ngôn ngữ ngắn nó còn là phương tiện thể thực thi các dự án OpenSource mà ai tham gia đều buộc phải Open?
....
"Ngắn gọn" ở đây hơi chủ quan. Điển hình:
C là ngôn ngữ cấu trúc, lại rất gần mã máy cho nên hầu hết các hàm thư viện của nó viết bằng mã macro máy. Nếu tôi muốn viết ngắn gọn, tôi có thể tự tạo macro để code tôi gọi.
C++ là dạng hướng đối tượng. Hầu hết các hàm thư viện của C++ nằm trong STL được viết với mục đích chuyên tốc độ. Vì là hướng đối tượng cho nên nếu tôi có sẵn một thư viện class hoành tráng thì code của tôi cũng rất ngắn gọn. Code chính chỉ việc dựng đối tượng và kêu nó làm việc.
Trong trường hợp này, nếu không kể code class thư viện thì code chính rất ngắn.
C# nếu có Linq thì sẽ rút ngắn lệnh truy vấn dữ liệu rất nhiều. Như vậy code ấy tính là C# hay Linq?

Ví dụ: điển hình của C++ là câu đố kinh điển "làm thế nào để hiển thị câu "Hello" 20 lần mà khong dùng vòng lặp, không đệ quy?
Câu trả lời là đặt một lớp với hàm dựng mặc định hiển thị câu "Hello"; đặt một lớp khác có thuộc tính là một mảng 20 phần tử loại lớp kia. Khi khởi lớp sau thì tự động 20 phần tử kia sẽ gọi hàm dựng của chúng.

Không biết anh có hiểu nhầm gì đó không. Theo em nghĩ VBA thông qua C++ để lấy dữ liệu trên bảng tính sau khi xử lý dữ liệu xong lại thông qua C++ để ghi vào bảng tính. Vì VBA là độc lập, nó chỉ bổ trợ cho Excel.
Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước. Mọi việc sau này VBA phải thông qua C++ để thực hiện.
Excel được viết bằng C++ và C# phải không anh!
..
Sai bét. Excel được viết bằng C++. Tức là các hàm và đối tượng được viết bằng C++. VBA chỉ gọi các hàm này thôi. Hầu hết các hàm chuyên thì được nối thẳng vào code, các hàm còn lại đưa vào dll (tương tự như các API's)
Có thể trình dịch và nền tảng VBA được viết bằng C++, nhưng theo tôi biết thì hầu hết các trình dịch đươc viết bằng ngôn ngữ tối ưu của từng nơi. Tức là rất có khả năng MS viết bằng ngôn ngữ riêng của họ.

Khi khởi động Excel thì C++ sẽ được biên dịch và chạy trước
Đúng là lý luận của dân Python, hoàn toàn không có một khái niệm gì về biên dịch và kết nối.
 
Upvote 0
Thì cũng tùy có cái nên cho ... có cái thì ko cho ... chính vì vậy mới phân biệt được cái nọ cái kia ===\.-0-0-0--0-0-0--0-0-0--0-0-0-
mà sao bác bill ko cho hết đi nhỉ ... cất dấu làm chi không biết ????!!!! mà cái thư viên Hàm Đồ sộ đó của Bác Bill vẫn cho xài thoải mái đó chi ???
nói chung trang bị con win và bộ office có bản quyền cũng gần 5 chai , nên khi dùng các chức năng của windows tính ra cũng đâu có miễn phí !
khi dùng các hàm API của win mình thường phải gò theo khuôn khổ các khai báo có sẵn mà không biết trong các hàm API đó nó làm gì , ko như Linux vừa miễn phí mà ta gần như có thể xem mọi thứ bên trong, thông qua đó có thể hiểu đc máy tính nó hoạt động thế nào nếu nghiên cứu , đợi 1 ngày có bản office hỗ trợ macro trên Linux ^^
 
Upvote 0
ĐỌC BÀI NÀY Mạnh thấy mấy chữ To mà Đen thế kia thì hoc xong viết code mà ko bảo vệ được chính thành quả của mình thì chám lắm
hay viết xong lại phải dùng 1 Tools của bên thứ 3 thứ 4 gì đó Bill nó lại xong mới cho ai đó xài thấy mất công quá

lâu nay thấy mọi người nói Python rảnh tính mò thử quậy chơi xem tình hình sao ... thấy nói vậy mất gió luôn ... 123 Run -0-0-0--0-0-0-
VBA cũng là 1 dạng open source đó thôi, mà GPE này sống nhờ VBA open đó... Thực ra VBA là 1 dạng ngôn ngữ script nên có gì giấu đâu
 
Upvote 0
nói chung trang bị con win và bộ office có bản quyền cũng gần 5 chai , nên khi dùng các chức năng của windows tính ra cũng đâu có miễn phí !
khi dùng các hàm API của win mình thường phải gò theo khuôn khổ các khai báo có sẵn mà không biết trong các hàm API đó nó làm gì , ko như Linux vừa miễn phí mà ta gần như có thể xem mọi thứ bên trong, thông qua đó có thể hiểu đc máy tính nó hoạt động thế nào nếu nghiên cứu , đợi 1 ngày có bản office hỗ trợ macro trên Linux ^^
Có những cái mang tiếng miễn phí mà đối với người dùng chưa hẳn đã miễn phí.
Theo bạn nghĩ, nếu bạn là chủ doanh nghiệp, trang bị hệ thống Linux hay Windows sẽ rẻ hơn?
Gợi ý: giá một chuyên viên Linux cao hơn Windows. Mướn nhân viên biết sử dụng Unix và OpenOffice đắt hơn Windows và MS Office.
Mã nguồn mở có nghĩa là thằng admin có thể mò mẫm sửa lại theo ý nó. Bạn có đủ tự tin để kiểm soát nó không?
 
Upvote 0
Tôi có vài ngu ý tưởng đơn giản thế này còn chuyện capslock đúng là khó thật.
Tôi thấy mấy nước châu Á họ dùng ký tự latin đơn giản vô cùng. Xem comment bóng đá trên youtube thấy mấy anh Malaysia với Indonesia dùng ký tự cực kỳ đơn giản có sẵn ngay trên bàn phím. Như anh Nhật phiên âm Tô ky ô, Tô si ba cũng chỉ là Tokyo với Toshiba nào có cần thêm mũ ô gì đâu
Không hiểu sao trong các nước dùng chữ cái latin ký âm có Việt Nam, và Trung Quốc đứng đầu về độ rối rắm. Ngày xưa dùng chung Hán tự nên mới có câu "Đồng chủng đồng văn". Bây giờ dùng Latin thì "Khác chủng nhưng mà rối rắm văn" :sweatdrop:
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sai bét. Excel được viết bằng C++. Tức là các hàm và đối tượng được viết bằng C++. VBA chỉ gọi các hàm này thôi. Hầu hết các hàm chuyên thì được nối thẳng vào code, các hàm còn lại đưa vào dll (tương tự như các API's)
Có thể trình dịch và nền tảng VBA được viết bằng C++, nhưng theo tôi biết thì hầu hết các trình dịch đươc viết bằng ngôn ngữ tối ưu của từng nơi. Tức là rất có khả năng MS viết bằng ngôn ngữ riêng của họ.
Đúng là lý luận của dân Python, hoàn toàn không có một khái niệm gì về biên dịch và kết nối.
Khi khởi động Excel xong. Không phải mã C++ dựng sẵn được biên dịch và nó nằm chờ lệnh gõ vào bảng tính hay sao vậy anh.
Không có cái gì chạy trước thì VBA vô tự làm hết chăng.
Nếu không thông qua Bảng dựng C++ thì VBA làm sao chạm vào được Cells, làm sao điều khiển được Excel.

"...Hầu hết các hàm chuyên thì được nối thẳng vào code, các hàm còn lại đưa vào dll..."
Cái đoạn này anh nói làm em phải suy nghĩ. Hàm gì nối thẳng vào code. Rồi đưa hàm vào Dll .
Cái đưa thẳng vào Code là hàm được viết đặt trong Thư viện liên kết tĩnh?

Cái hàm đặt trong Thư viện liên kết động Dll được VBA gọi sau thì cái gì nằm chờ chực để kết nối với nó nếu bản dựng C++ không chạy trước nằm chờ bắt chúng thì cái gì thực thi hàm đấy để đưa vào Bảng tính.

VBA khởi tạo lại toàn bộ rồi tự đưa vào bảng tính?
VBA tự đi vào bảng tính rồi lấy dữ liệu? phương thức lấy như thế nào?
VBA không thông qua Bản dựng C++ thì với EXCEL 2016 hơn 1 triệu dòng, hơn 16000 cột.
Nếu anh nói VBA nó làm đó! Nó lấy cái gì ở đâu đó nó làm đó ! Thì không có gì để bàn.

"...Có thể trình dịch và nền tảng VBA được viết bằng C++..." - Sao anh nói mơ mơ hồ hồ
 
Lần chỉnh sửa cuối:
Upvote 0
Trước khi phê bình gõ tiếng Việt thì đã xem qua cái bàn tính mẫu tự Ả Rập chưa?
Người Đông Âu dùng mẫu tự Cyrillic mà có thấy họ than phiền gì đâu?
Nói về giản dị thì 100 năm trước đâu có ai biết trước sự áp đảo của văn hoá Mẽo trên toàn thế giới mà lường trước đặt ngôn ngữ mình theo "tiêu chuẩn" tiếng Anh?

May là người Pháp và Bồ đào nha dùng đơn vị đo lường Metric. Chứ nếu ngược lại Pháp dùng Imeprial và Mẽo dùng Metric thì dân Việt còn thúi đầu cho thiên hạ chửi thêm cái vụ dùng đơn vị "rắc rối, phản khoa học".
 
Upvote 0
Trước khi phê bình gõ tiếng Việt thì đã xem qua cái bàn tính mẫu tự Ả Rập chưa?
Người Đông Âu dùng mẫu tự Cyrillic mà có thấy họ than phiền gì đâu?
"Ở bầu thì tròn, ở ống thì dài" Người Việt làm nô lệ cho dân tộc nào thì chữ viết cũng chi phối bởi dân tộc đó.

Cũng có dân tộc phải dùng chữ viết ngoại quốc vì chịu ảnh hưởng cưỡng bức văn hóa (đồng hóa) nhưng một khiđộc lập thì họ sẵn sàng tiếp thu cái mới miễn sao có lợi cho muôn đời con cháu chứ không phải vì tự nhốt mình vì lưu luyến vài trăm năm lịch sử.

Azerbaizan, Turkmenistan, Kazakhstantừ từ bỏ bộ chữ Cyrillic (xuất hiện dưới ảnh hưởng từ thời đế quốc Nga) sang Latin từ sau Liên Xô sụp đổ. Và chắc chắn là số nước theo trào lưu này sẽ còn tăng. Dù rằng chi phí ban đầu khá tốn kém nhưng nếu xét lợi ích lâu dài cho nhiều thế hệ thì lợi ích mang lại là vô hạn (vài ngàn thế hệ là lợi được cả trăm tỷ đô ấy chứ nếu xét về số công sức tiết kiệm lẫn những phiền toái được loại bỏ).

Giữa các nước dùng bộ ký tự Latin thì bộ chữ quốc ngữ Việt Nam là phức tạp nhất và bị biến đổi nhiều nhất so với bộ chữ Latin gốc dẫn đến là nhiều phiến toái. Có một hãng hàng không Việt Nam đặt tên là TĂNG TỐC nhưng khi ghi bằng chữ Latin trên bảng thông báo điện tử là TANG TOC thế là nhiều vị hàng khách lẩm nhẩm thành "Tang tóc" nên rốt cuộc phá sản vì không ai dám đi (chuyện thật nhé). Đó là 1 sự oái oăm điển hình của chữ quốc ngữ sử dụng trên hệ thống thuần Latin. Tại sao các nước khác cũng mượn bản ký tự Latin chuẩn (không cần thêm ký tự phức tạp) nhưng vẫn có thể diễn đạt được ngôn ngữ của họ?

Xin nhấn mạnh phạm vi những nước dùng chữ Latin thôi nhé bộ chữ Arab với Cyrillic không liên quan tới phân tích của cháu
 
Lần chỉnh sửa cuối:
Upvote 0
Topic (chủ đề) này , chủ topic tự làm khó mình, chiều công nhân quá làm khó máy tính. Cứ để công nhân sai vài lần là họ tự có cách nhớ và tự khắc sẽ biết khi nào cần dùng thì mới chạy Unikey, xong thì tắt để luôn sẵn sàng quét QR-Code
 
Upvote 0
Topic (chủ đề) này , chủ topic tự làm khó mình, chiều công nhân quá làm khó máy tính. Cứ để công nhân sai vài lần là họ tự có cách nhớ và tự khắc sẽ biết khi nào cần dùng thì mới chạy Unikey, xong thì tắt để luôn sẵn sàng quét QR-Code
Chính xác. Tôi cũng rất nhiều lần ngạc nhiên. Ví như anh quản lý nọ cứ kêu là mỗi người làm một kiểu rồi anh ta không thể tổng hợp được. Vậy thì thử hỏi kỷ luật ở đâu? Báo cáo sếp. Có qui định rõ ràng, ai làm sai phải làm lại. Có mức độ lưu ý, cảnh cáo, sa thải. Sếp có quyền lực, có nội qui hậu thuẫn mà phải thua bọn làm công ăn lương thì quá lạ. Có kỷ cương rõ ràng, cố tình vi phạm thì cảnh cáo, sa thải. Lúc đó nếu có ra tòa lao động thì anh công nhân kia cũng không thể thắng kiện được.
 
Upvote 0
Topic (chủ đề) này , chủ topic tự làm khó mình, chiều công nhân quá làm khó máy tính. Cứ để công nhân sai vài lần là họ tự có cách nhớ và tự khắc sẽ biết khi nào cần dùng thì mới chạy Unikey, xong thì tắt để luôn sẵn sàng quét QR-Code

Xin chào tam888,

Như OT cũng đã nói nỗi khổ ở những bài đầu đó ạ. Tổ trưởng đã nhắc nhở nhiều nhưng vẫn không triệt để.
Nếu trừ điểm hạ loại ABC hoặc sa thai mà giải quyết được vấn đề thì không còn gì phải khổ ạ.

Vấn đề là thế này ạ, công ty OT nghèo có thể các chế độ chưa thỏa đáng bằng các công ty khác nên họ cũng không thiết tha, không có nguyện vọng gắn bó lâu dài vì thế công nhân ra vào thay đổi liên tục nên có trừa điểm thi đua họ cũng không có gì phải bận tâm ạ.
Và quan trọng hơn hết là kiểm tra hàng xuất - nhập không được phép để xảy ra lỗi cần phải đặt lên hàng đầu ạ. Khi sự việc đã rồi mà sa thải công nhân cũng không lấy lại được uy tín với khác hàng nữa ạ. Đã liên quan đến khách hàng có rủi ro phải xử lý triệt để ạ.
Vì vậy mà trường hợp này OT nghĩ rằng không hẳn là chiều công nhân ạ.
Cảm ơn bạn đã góp ý ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Nuôi phải con chó cắn bậy thì giải pháp chính đáng nhất là cho nó vào nồi rựa mận. Nếu không biết nhậu cầy thì đem đối chảo nhôm (*).
Cố gắng xiềng xich thì cũng có lúc sơ hở, nó cắn què người ta mà mang tội.

Ngoại lệ: bạn sẵn của để bồi thường nạn nhân hoặc lo lót CA đấm mõm nạn nhân.

(*) hồi xưa, ở vùng tôi có anh mua chó. Anh ấy đi xe đạp chở một đống nồi chảo nhôm để đổi chó.
 
Upvote 0
Bạn thử lại với file này.
Nhân tiện, tiêu đề có lẽ nên nói nguyên nhân là do bộ gõ tiếng Việt hoặc Unikey thì mới rõ.
OT đã test kết quả đã như sự mong đợi của OT rồi ạ, cảm ơn anh Hữu Thắng nhiều ạ.

Tôi có vài ngu ý tưởng đơn giản thế này còn chuyện capslock đúng là khó thật.
Tôi thấy mấy nước châu Á họ dùng ký tự latin đơn giản vô cùng. Xem comment bóng đá trên youtube thấy mấy anh Malaysia với Indonesia dùng ký tự cực kỳ đơn giản có sẵn ngay trên bàn phím. Như anh Nhật phiên âm Tô ky ô, Tô si ba cũng chỉ là Tokyo với Toshiba nào có cần thêm mũ ô gì đâu
Không hiểu sao trong các nước dùng chữ cái latin ký âm có Việt Nam, và Trung Quốc đứng đầu về độ rối rắm. Ngày xưa dùng chung Hán tự nên mới có câu "Đồng chủng đồng văn". Bây giờ dùng Latin thì "Khác chủng nhưng mà rối rắm văn" :sweatdrop:

Cảm ơn bạn đã cho OT thêm cách làm khác ngắn gọn để tham khảo ạ.
anh @Nguyễn Duy Tuân ơi, với 2 cách làm của anh Hữu Thắng và bạn Vô danh, theo kinh nghiệm của anh đã từng va chạm nhiều với thực tế. Vậy còn tình huống nào dẫn đến lỗi do bộ gõ tiếng Việt hay phím CapsLock nữa không ạ. :)
----------------
Chính xác. Tôi cũng rất nhiều lần ngạc nhiên. Ví như anh quản lý nọ cứ kêu là mỗi người làm một kiểu rồi anh ta không thể tổng hợp được. Vậy thì thử hỏi kỷ luật ở đâu? Báo cáo sếp. Có qui định rõ ràng, ai làm sai phải làm lại. Có mức độ lưu ý, cảnh cáo, sa thải. Sếp có quyền lực, có nội qui hậu thuẫn mà phải thua bọn làm công ăn lương thì quá lạ. Có kỷ cương rõ ràng, cố tình vi phạm thì cảnh cáo, sa thải. Lúc đó nếu có ra tòa lao động thì anh công nhân kia cũng không thể thắng kiện được.
Nuôi phải con chó cắn bậy thì giải pháp chính đáng nhất là cho nó vào nồi rựa mận.
....
Cảm ơn hai Bác Siwtom và VetMini đã góp ý cho con, cấp dưới làm sai thiếu trách nhiệm đối với công việc xử lý là phải rồi ạ. Nhưng đôi khi lỗi xảy ra không phải là do cố tình mà cũng là vô tình thôi ạ. Mà cái vô tình này thì lại rất nghiêm trọng nó ảnh hưởng rất lớn vì vậy mà cấp trên cũng phải có trách nhiệm hỗ trợ triệt để cấp dưới để làm sao cấp dưới làm việc vui vẻ với tinh thần thoải mái ạ.

Xin trân cảm ơn sự giúp đỡ của tất cả mọi người ạ.
Oanh Thơ
 
Upvote 0
Xin chào tam888,

Như OT cũng đã nói nỗi khổ ở những bài đầu đó ạ. Tổ trưởng đã nhắc nhở nhiều nhưng vẫn không triệt để.
Nếu trừ điểm hạ loại ABC hoặc sa thai mà giải quyết được vấn đề thì không còn gì phải khổ ạ.

Vấn đề là thế này ạ, công ty OT nghèo có thể các chế độ chưa thỏa đáng bằng các công ty khác nên họ cũng không thiết tha, không có nguyện vọng gắn bó lâu dài vì thế công nhân ra vào thay đổi liên tục nên có trừa điểm thi đua họ cũng không có gì phải bận tâm ạ.
Và quan trọng hơn hết là kiểm tra hàng xuất - nhập không được phép để xảy ra lỗi cần phải đặt lên hàng đầu ạ. Khi sự việc đã rồi mà sa thải công nhân cũng không lấy lại được uy tín với khác hàng nữa ạ. Đã liên quan đến khách hàng có rủi ro phải xử lý triệt để ạ.
Vì vậy mà trường hợp này OT nghĩ rằng không hẳn là chiều công nhân ạ.
Cảm ơn bạn đã góp ý ạ.
Vậy thì bạn cứ áp dụng thôi, giúp và chăm lo cho nhân viên như bạn thì tuyệt vời.
Tôi mà nhân viên ở đó, tôi muốn đề nghị bạn hỏi và kiếm giúp̀ thêm phần mềm hay VBA thế nào đó, khi sếp gần đến thì game, facebook, trang GPE, web báo chí ... tự ẩn đi và Excel được bật lên sẵn sàng cho scan QR-Code ... vì có webcam nhận dạng mặt / bóng sếp thì tốt quá - như thế tốt cho cả nhân viên cả sếp (đỡ buồn phiền phải nhắc nhở nhân viên)
Có được không?
 
Upvote 0
Vậy thì bạn cứ áp dụng thôi, giúp và chăm lo cho nhân viên như bạn thì tuyệt vời.
Tôi mà nhân viên ở đó, tôi muốn đề nghị bạn hỏi và kiếm giúp̀ thêm phần mềm hay VBA thế nào đó, khi sếp gần đến thì game, facebook, trang GPE, web báo chí ... tự ẩn đi và Excel được bật lên sẵn sàng cho scan QR-Code ... vì có webcam nhận dạng mặt / bóng sếp thì tốt quá - như thế tốt cho cả nhân viên cả sếp (đỡ buồn phiền phải nhắc nhở nhân viên)
Có được không?

Dạ,cảm ơn bạn trường hợp này thì không ạ vì máy tính này không được kết nối internet ạ.
Hơn nữa cũng chỉ chống lỗi vô tình thôi ạ, còn cố tình phá thì không còn cách nào nữa ạ.
 
Upvote 0
Dạ,cảm ơn bạn trường hợp này thì không ạ vì máy tính này không được kết nối internet ạ.
Hơn nữa cũng chỉ chống lỗi vô tình thôi ạ, còn cố tình phá thì không còn cách nào nữa ạ.
Có nhận tôi làm nhân viên không? Tôi ứng cử, đảm bảo không cần thêm code vba gì cả (thêm phiền phức và làm chậm), mà unikey sẽ không làm khó... không có chuyện nhầm lẫn
 
Upvote 0
Có nhận tôi làm nhân viên không? Tôi ứng cử, đảm bảo không cần thêm code vba gì cả (thêm phiền phức và làm chậm), mà unikey sẽ không làm khó... không có chuyện nhầm lẫn
Hi, chắc bạn đùa vui ạ.
Đúng là đáng ra công việc này cũng không cần cầu kỳ phức tạp với những người có ý thức công việc, chỉ cần biết chút về máy tính là ổn ạ.
OT là nhân viên bình thường nên cũng không thể quyết định được việc lấy người.
2 nữa là mức thu nhập của công ty OT chắc chắn sẽ không thỏa đáng với những người có kinh nghiệm và kiến thức chuyên môn như bạn đâu ạ.
Cảm ơn bạn đã quan tâm :)
 
Upvote 0
Ở bài #3 có nói rằng:
"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"
1. máy tính chuyên để... Lý do tại sao máy này đã nói là "chuyên" mà lại phải chạy công việc khác?
2. kiểm tra hàng đầu vào và đầu ra... "Kiểm tra" là công việc gì? Đã làm chức năng "kiểm tra" mà lại chập choạng quên tới quên lui.
Cơ quan này bày đặt kuyu a cốt này nọ cho nó hoành tráng. Chỉ có công việc kiểm tra mà cũng không thể bảo đảm chất lượng!
 
Upvote 0
Ở bài #3 có nói rằng:
"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"
1. máy tính chuyên để... Lý do tại sao máy này đã nói là "chuyên" mà lại phải chạy công việc khác?
2. kiểm tra hàng đầu vào và đầu ra... "Kiểm tra" là công việc gì? Đã làm chức năng "kiểm tra" mà lại chập choạng quên tới quên lui.
Cơ quan này bày đặt kuyu a cốt này nọ cho nó hoành tráng. Chỉ có công việc kiểm tra mà cũng không thể bảo đảm chất lượng!
Dạ vâng đúng là chuyên Bác ạ, nhưng chuyên ở đây là đối với máy tính thiết bị ấy Bác.
Còn con người thi thoảng lại ra vào thay đổi, người này người kia, ca này ca kia. Nhất là sau 18h thậm trí có lúc họ để cả mấy ông lái xe quét mã vạch hộ để lái đó giao hàng sớm về sớm ấy chứ Bác.
 
Upvote 0
OT đã test kết quả đã như sự mong đợi của OT rồi ạ, cảm ơn anh Hữu Thắng nhiều ạ.
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
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ở bài #3 có nói rằng:
"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"
1. máy tính chuyên để... Lý do tại sao máy này đã nói là "chuyên" mà lại phải chạy công việc khác?
2. kiểm tra hàng đầu vào và đầu ra... "Kiểm tra" là công việc gì? Đã làm chức năng "kiểm tra" mà lại chập choạng quên tới quên lui.
Cơ quan này bày đặt kuyu a cốt này nọ cho nó hoành tráng. Chỉ có công việc kiểm tra mà cũng không thể bảo đảm chất lượng!
Kiểu du di đó, cứ kêu trời là sao luật không nghiêm, rồi cuối cùng quản lý đổi tại dân không ý thức và thế là cấm
 
Upvote 0
anh @Nguyễn Duy Tuân ơi, với 2 cách làm của anh Hữu Thắng và bạn Vô danh, theo kinh nghiệm của anh đã từng va chạm nhiều với thực tế. Vậy còn tình huống nào dẫn đến lỗi do bộ gõ tiếng Việt hay phím CapsLock nữa không ạ. :)

Xin trân cảm ơn sự giúp đỡ của tất cả mọi người ạ.
Oanh Thơ

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.
 
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

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

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

Back
Top Bottom