Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Shell_NotifyIcon–значок исчезает при наведении

7
27 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Имеется такой
Код:
uNID NotifyIconData<Type NotifyIconData,,,,,,'Это всплывающая подсказка…К.О. не дремлет!!!'>
szShell32 DB 'Shell32.dll',0

XOr EBX,EBX
Invoke ExtractIcon,EBX,Addr szShell32,47
Mov uNID.hIcon,EAX
Mov uNID.uFlags,NIF_Icon Or NIF_Tip
Invoke Shell_NotifyIcon,NIM_Add,Addr uNID
Mov uNID.NUI.uVersion,NotifyIcon_Version
Invoke Shell_NotifyIcon,NIM_SetVersion,Addr uNID
Invoke Shell_NotifyIcon,NIM_Delete,Addr uNID
Invoke DestroyIcon,uNID.hIcon
После выполнения Invoke Shell_NotifyIcon,NIM_Add,Addr uNID значок,конечно,появляется в трее(о чудо!),но,стоит только навести на него,как он исчезает,естественно,не успев выдать tooltip.После этого Invoke Shell_NotifyIcon,NIM_Delete,Addr uNID возвращает 0(если значок не трогать,то возвращается 1,как и надо)
Как исправить эту ситуацию?Может,я чего недодал в структуру?

Ещё вопрос:вызывать Shell_NotifyIcon с NIM_SetVersion надо до NIM_Add,после или пофиг?Ибо MSDN'овское "NIM_SETVERSION must be called every time a notification area icon is added (NIM_ADD)" как-то не совсем поясняет,до или после следует устанавливать версию

P.S.Здесь приведён ВЕСЬ код,относящийся к операциям с треем.Т.е. ничего не упущено–заполнения полей и всё такое
52K
28 декабря 2009 года
ruprogman
20 / / 26.10.2009
Цитата: @pixo $oft
Как исправить эту ситуацию?


Увы, придется прикручивать гуй...
Необходимо окно (uNID.hWnd, можно и скрытое), в которое пойдет сообщение (uNID.uCallbackMessage, сойдет WM_APP+1). Флаги такие: NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP.

Цитата: @pixo $oft
вызывать Shell_NotifyIcon с NIM_SetVersion надо до NIM_Add,после или пофиг?


Пример из Platform SDK делает это после создания иконки, если до - терпит фейл.

52K
28 декабря 2009 года
ruprogman
20 / / 26.10.2009
Вот минимум для консоли:
Код:
#include <tchar.h>
#include <windows.h>
#include <shellapi.h>

HINSTANCE g_hInst;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    #define uNotifyID 0
    #define szNotifyTip _T("Это всплывающая подсказка…К.О. не дремлет!!!")
    #define WMAPP_NOTIFYCALLBACK (WM_APP + 1)

    NOTIFYICONDATA uNID = {NOTIFYICONDATA_V1_SIZE};
    static HICON s_hNotifyIcon;

    switch (message)
    {
    case WMAPP_NOTIFYCALLBACK:
        // убей программу правым кликом, %username%
        if (uNotifyID == wParam && WM_RBUTTONUP == lParam)
            DestroyWindow(hwnd);
        break;

    case WM_CREATE:
        s_hNotifyIcon = ExtractIcon(NULL, _T("shell32.dll"), 47);

        uNID.uID = uNotifyID;
        uNID.hWnd = hwnd;
        uNID.uCallbackMessage = WMAPP_NOTIFYCALLBACK;
        uNID.hIcon = s_hNotifyIcon;
        uNID.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP;
        _tcscpy_s(uNID.szTip, _countof(uNID.szTip), szNotifyTip);
        Shell_NotifyIcon(NIM_ADD, &uNID);
       
        uNID.uVersion = NOTIFYICON_VERSION;
        Shell_NotifyIcon(NIM_SETVERSION, &uNID);
        break;

    case WM_DESTROY:
        uNID.uID = uNotifyID;
        Shell_NotifyIcon(NIM_DELETE, &uNID);

        DestroyIcon(s_hNotifyIcon);
       
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    #define szWindowClass _T("MyNotifyIconClass")

    HWND    hwnd;
    MSG msg;
    WNDCLASSEX wcex = {sizeof(wcex)};

    g_hInst = GetModuleHandle(NULL);
   
    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = g_hInst;
    wcex.lpszClassName = szWindowClass;
    RegisterClassEx(&wcex);

    if (hwnd = CreateWindow(szWindowClass, NULL, WS_OVERLAPPEDWINDOW,
        0, 0, 0, 0, NULL, NULL, g_hInst, NULL));
    {
        ShowWindow(hwnd, SW_HIDE);
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return 0;
}
7
28 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Вот блин!..Так и знал,что придётся прикручивать окно:(
Прога без гуя что мужик без …Так,о чём это я?

Да,насколько я помню,вызов NIM_SetVersion фэйл-таки терпел(сейчас нет времени затестить).Теперь буду переводить на асм,спасибо,что набрал за меня:)
И да,окна нулевого размера рулят!:D

P.S.Ну и спасибо за то,что доставил мне радости–завтра защищать курсовую,я хоть немного разрядился (=
399
29 декабря 2009 года
KIV
432 / / 20.01.2009
Цитата:
И да,окна нулевого размера рулят!


Лучше всё таки скрытые. Я конечно не уверен, но Windows вполне может пытаться их отрисовать и совершать с ними другие операции, отнимая ресурсы.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог