• Thứ Tư, 27/06/2007 17:28 (GMT+7)

    Hiệu lực hóa thay đổi mang tính hệ thống với VB6

    TGVT tháng 4/2007 có câu hỏi về cách "refresh registry" trong Visual Basic. Tạp chí đã trả lời rất chính xác về việc "Windows không thể tự động thông báo cho ứng dụng tương ứng biết để thay đổi theo thiết lập mới trong registry vì Windows không biết entry nào dành cho ứng dụng nào" và "không phải ứng dụng nào cũng có khả năng refresh theo thiết lập cấu hình mới thay đổi". Tuy vậy, những thay đổi mang tính hệ thống vẫn có thể được thông báo đến tất cả các ứng dụng đang chạy và theo kinh nghiệm của bản thân tôi, những thay đổi như đăng ký kiểu file mới thường được Windows Explorer nhận biết và thực hiện ngay.

    Các thay đổi mang tính hệ thống có thể được thông báo tới tất cả các ứng dụng hiện thời bằng đoạn lệnh VB sau:

    Const HWND_BROADCAST As Long = &HFFFF&

    Const WM_SETTINGCHANGE As Long = &H1A

    Declare Function SendMessage Lib "user32" _

    Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _

    ByVal wParam As Long, lparam As String) As Long

    Call SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0&, ByVal 0&)

    Việc sử dụng khá dễ dàng nhưng các bạn vẫn nên lưu ý hai điểm sau:

    Thứ nhất, khi gửi thông báo với tham số HWND_BROADCAST thì thông điệp được gửi phải có tính chất hệ thống (tức là các thông điệp trong khoảng 0..WM_USER-1 và khoảng thông điệp đã đăng ký MAXINTATOM .. MAXWORD). Điều đó cũng có nghĩa là chúng ta không thể gửi các thông điệp trong đoạn WM_USER hay WM_APP theo kiểu broadcast. Hậu quả của việc vi phạm quy tắc này là không thể đoán trước.

    Điểm lưu ý thứ hai, trong một số trường hợp chúng ta có thể dùng hàm SHSendMessageBroadcast của thư viện Shlwapi.dll. Gọi hàm này tương đương với việc gọi SendMessage(HWND_BROADCAST,...). Hơn thế, việc dùng hàm SHSendMessageBroadcast còn có tác dụng tránh khả năng Explorer bị "treo" vì một cửa sổ nào đó không gửi phản hồi khi nhận được thông báo. SHSendMessageBroadcast không được export theo tên. SHSendMessageBroadcastA (ansi) được export với số hiệu 432 còn SHSendMessageBroadcastW (unicode) là 433. Điều hạn chế là chúng ta chỉ có thể dùng hàm này với các phiên bản Windows từ XP về sau và phiên bản thấp nhất của thư viện shlwapi.dll hỗ trợ là 5.0 (các hàm API để xác định phiên bản của Windows và của các thư viện thì bạn có thể tự tìm hiểu). Cách khai báo SHSendMessageBroadcast cũng không có gì phức tạp:

    Declare Function SHSendMessageBroadcast _

    Lib "SHLWAPI.DLL" Alias "#432" ( _

    ByVal uMsg As Long, _

    ByVal wParam As Long, _

    ByVal lParam As Long) As Long.

    Nguyễn Anh Tuấn
    124 Vương Thừa Vũ, Hà Nội

    ID: A0706_140