Thực ra phần thêm tiếng Việt thì không phải là cái gì đặc biệt. Quan trọng là thủ tục có ngắn gọn để dùng lẫn trong các ứng dụng của ta không. Làm sao chỉ cần gắp mô đun và thả vào ứng dụng là dùng được.
Về vấn đề thêm tiếng Việt thì các bạn cần chú ý đến một thủ thuật gọi là Hook - Câu móc.
Kỹ thuật này được áp dụng khi ta cần thiết muốn thay đổi một số nội dung nào đó của các hộp thoại do hệ thống/ ứng dụng nào đó cung cấp. Trên thực tế, các hộp thoại đều gồm các điều khiển với các thông tin có thể điều khiển được.
Ta hãy hiểu cơ chế hoạt động của Windows như thế này:
1. Gọi lệnh hiển thị cái gì đó (thông điệp, hộp thoại).
2. Đầu tiên đối tượng đó được nạp vào bộ nhớ và đăng ký một thẻ (thường Windows gọi là Handle) sau đó nó sẽ đăng ký chuỗi các thông điệp/ lệnh cần thực hiện để có thể xuất hiện trên màn hình.
3. Windows sẽ lần lượt thực hiện các thông điệp đó và kết thúc chu trình.
Vậy kỹ thuật câu móc sẽ được can thiệp vào bước 2 theo đó ta sửa đổi vài thông tin trong các thông điệp để nó hiển thị theo ý mình. Đến đây có 2 kỹ thuật hiểu một cách nôm na như sau:
+ Chèn nội dung thông điệp chút ít để nó có các thông điệp ta cần- cái này gọi là
Hook
+ Thêm vào vài lệnh theo yêu cầu - cái này gọi là
SubClass.
Như thế thì ta có thể can thiệp vào hầu hết các hoạt động của hệ thống với bộ võ này.
Trở về thông điệp msgBox. Tôi dùng ngay thủ tục MsgBox để tiện dụng cho việc gọi thông điệp MsgBox. Vì tôi dùng tiếng Việt nên không cần phải dự phòng cho tình huống dùng tiếng Anh nữa.
Bước 1: Thiết lập cách hiển thị MsgBox
Xác định xem tham số truyền vào là gì để biết loại ứng dụng. Vì thường người ta sẽ truyền vào dạng tham số có Loại thông tin kết hợp luôn với loại thông điệp
Mã:
MsgBox "Hi", vbCritical + vbYesNo, "xxxx"
các tham số vbCritical, vbYesNo ... chẳng qua chỉ là các hằng số và nó được gắn với giá trị nhất định tương đối nhất quán và thống nhất
Ở đây tôi không thiết kế phần xác định nút nào là mặc định vì mất thời gian và cũng không quá cần thiết
Bước 2: Khởi tạo thủ tục câu móc
Để dùng được các hàm câu móc, chúng ta phải khai báo thêm các hàm API của hệ thống để sử dụng trong đoạn đầu Module
Hàm này để lấy thẻ đăng ký của ứng dụng gọi thông điệp
Mã:
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Hàm này để thiết lập các giá trị vào đối tượng trong hộp thoại
Mã:
Private Declare Function SetDlgItemText Lib "user32" _
Alias "SetDlgItemTextW" _
(ByVal hDlg As Long, _
ByVal nIDDlgItem As Long, _
ByVal lpString As String) As Long
Hàm này để thiết lập chế độ câu móc vào đối tượng nào của ứng dụng gọi hộp thoại
Mã:
Private Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadID As Long) As Long
Hàm này để kết thúc quá trình câu móc
Mã:
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Sau khi khai báo xong, chúng ta bắt đầu gọi thủ tục Hook bằng cách
Mã:
hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)
Có 4 tham số, ta chỉ cần chú ý đến:
+
AddressOf MsgBoxHookProc: Địa chỉ của thủ tục câu móc trong bộ nhớ
+
GetCurrentThreadId: thẻ đăng ký của ứng dụng gọi thủ tục
Ở đây do hàm MsgBox được gọi ở chế độ Modal nên nó nổi lên trên cùng của ứng dụng và hệ thống dừng ở đó để chờ đợi thao tác do đó chỉ cần trả về thẻ Ứng dụng gọi hàm MsgBox là có thể lấy ngay được hộp thoại đang nổi lên. Với những hộp thoại không ở chế độ Modal thì phải dùng thêm một số tham số khác như Caption của hộp thoại, thẻ phụ ...vv
Đại loại hàm này sẽ đăng ký là: Khi hộp thoại đưa vào bộ nhớ thì thủ tục MsgBoxHookProc sẽ được kích hoạt và sửa đổi thông tin.
Sau khi gọi xong thì bỏ chế độ câu móc bằng
Mã:
UnhookWindowsHookEx hHook
Và tiếp tục với việc hiển thị thông điệp ra màn hình
Mã:
MsgBox = Application.Assistant.DoAlert(IIf(DlgCaption <> "", DlgCaption, App_Title), _
MessageTxt, msgButton, msgBoxIcon, ButtonDefault, msoAlertCancelDefault, True)
Thủ tục MsgBox này có thể áp dụng được với bất kỳ ứng dụng Office nào vì nó dùng thông điệp của Office Application.Assistant.DoAlert
Cái này tôi chộp được của Hoàng Trọng Nghĩa ở Giải pháp Excel (trước đây tôi dùng MsgBox của Hệ thống thấy nó xấu nên cuối cùng áp dụng cái Assistant của Nghĩa).
Đấy đơn giản thế thôi.
Nếu các bạn muốn tìm hiểu về Hook và SubClass thì có cả biển tài liệu để nghiên cứu nhờ dùng bác Gúc Gồ
Chúc các Cụ một ngày mới vui vẻ và hiệu suất cao