câu hỏi:Biểu tượng thông báo được đăng ký ở đâu và nếu nó đã được đăng ký từ vị trí khác thì làm cách nào để xóa nó?
mô tả:Tôi muốn sử dụng biểu tượng khay thông báo nên tôi đã khởi chạy mẫu Windows SDK để kiểm tra xem nó hoạt động như thế nào.
Vấn đề là một khi biểu tượng được đăng ký từ một vị trí, nó sẽ không thể được sử dụng ở bất kỳ nơi nào khác. Shell_NotifyIcon(...) không thành công ở những nơi khác nhau. Nó thậm chí còn được mô tả trong tệp readme của ví dụ:
Xin lưu ý rằng các biểu tượng thông báo được chỉ định bằng GUID được bảo vệ chống giả mạo bằng cách xác thực rằng chỉ một ứng dụng duy nhất đăng ký chúng. Việc đăng ký này được thực hiện vào lần đầu tiên bạn gọi Shell_NotifyIcon(NIM_ADD, ...) và tên đường dẫn đầy đủ của ứng dụng gọi là. được lưu trữ. Nếu sau đó bạn di chuyển tệp nhị phân của mình sang một vị trí khác, hệ thống sẽ không cho phép thêm lại biểu tượng.
Tôi đã thử sử dụng Shell_NotifyIcon(NIM_DELETE, ...) khi ứng dụng của tôi thoát nhưng nó vẫn không hoạt động và ứng dụng của tôi có thể được khởi chạy từ một vị trí khác. Tất nhiên. Tôi có thể hack nó bằng cách thay đổi hướng dẫn mỗi khi Shell_NotifyIcon(...) thất bại, nhưng tôi thích cách tiếp cận ít bạo lực hơn. Ngoài ra, tôi đã tìm kiếm hướng dẫn trong sổ đăng ký hệ thống và không tìm thấy nó.
Hướng dẫn trong ví dụ được định nghĩa như sau:
// Sử dụng hướng dẫn để xác định duy nhất biểu tượng của chúng tôi
lớp __declspec(uuid("9D0B8B92-4E1C-488e-A1E1-2331AFCE2CB5")) PrinterIcon;
Code tạo icon thông báo:
BOOL AddNotificationIcon(HWND hwnd)
{
NOTIFYICONDATA nid = {sizeof(nid)};
nid.hWnd = hwnd;
// thêm biểu tượng, đặt biểu tượng, chú giải công cụ và thông báo gọi lại.
// biểu tượng sẽ được xác định bằng GUID
nid.uFlags = NIF_ICON | NIF_MESSAGE |
nid.guidItem = __uuidof(PrinterIcon);
nid.uCallbackMessage = WMAPP_NOTIFYCALLBACK;
LoadIconMetric(g_hInst, MAKEINTRESOURCE(IDI_NOTIFICATIONICON), LIM_SMALL, &nid.hIcon);
LoadString(g_hInst, IDS_TOOLTIP, nid.szTip, ARRAYSIZE(nid.szTip));
Shell_NotifyIcon( NIM_ADD, &nid );
// ưu tiên NOTIFYICON_VERSION_4
nid.uVersion = NOTIFYICON_VERSION_4;
trả về Shell_NotifyIcon(NIM_SETVERSION, &nid);
}
Mã này là một phần của mẫu SDK Windows: SDKs/Windows/v7.1/Samples/winui/shell/appshellintegration/NotificationIcon
Vì thế. Giải pháp cuối cùng là tôi phải khai báo như thế này THÔNG BÁOICONDATA:
#define NOTIFICATIONTRAY_UID 666;
[…]
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.hWnd = hWnd;
nid.uID = THÔNG BÁOTRAY_UID;
nid.uFlags = NIF_ICON | NIF_MESSAGE |
nid.uCallbackMessage = WMAPP_NOTIFYCALLBACK;
LoadIconMetric( hInstance, MAKEINTRESOURCE( IDI_NOTIFICATIONICON ), LIM_SMALL, &nid.hIcon );
lstrcpy( nid.szTip, L"Văn bản chú giải công cụ" );
Shell_NotifyIcon( NIM_ADD, &nid );
// ưu tiên NOTIFYICON_VERSION_4
nid.uVersion = NOTIFYICON_VERSION_4;
trả về ( Shell_NotifyIcon( NIM_SETVERSION, &nid ) != 0 );
Tôi chưa đặt cờ NIF_GUID và GUID. Để sử dụng biểu tượng này sau (hủy, thêm thông báo bong bóng, v.v.) tôi phải cung cấp HWND và uID (cảm ơn Remy Lebeau gợi ý).
Tôi là một lập trình viên xuất sắc, rất giỏi!