Работа С Треем В Консольном Приложении

Тема в разделе "C и С++ FAQ", создана пользователем Vadik(R), 13 окт 2011.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Добрый вечер, форумчане!
    В общем, проблема в следующем. Была лабораторная работа по операционным системам, где было дано необязательно бонусное задание - свернуть консольное приложение в трей и развернуть его при клике по иконке. Вот свернуть окно в трей получилось почти без проблем. Проблема номер один - иконка в трее всегда прозрачная, какие бы параметры я не писал в функцию
    Код (C++):
    LoadIcon(GetModuleHandle(NULL), IDI_APPLICATION);
    Но это ещё не такая проблема, как с разворачиванием иконки. Почитав информацию на этом сайте, у меня получился следующий код:
    Код (C++):
    #include <iostream>
    #include <locale>
    #include <windows.h>

    using namespace std;

    HWND Window;

    LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    printf("Вошли в обработчик сообщений!\r\n");
    if ((uMsg == WM_USER) && (hWnd == Window) && (wParam == 0) && ((UINT)lParam == WM_LBUTTONDOWN))
    {
    printf("Ураа!!! Клик по иконке!!!\r\n");
    }
    return NULL;
    }

    int main()
    {
    int i;
    NOTIFYICONDATA NIData;
    WCHAR Title[128];
    setlocale(LC_ALL, "Rus");
    GetConsoleTitle(Title, sizeof(Title) / sizeof(Title[0]));
    Window = FindWindow(NULL, Title);
    //ShowWindow(Window, SW_HIDE);
    NIData.cbSize = sizeof(NOTIFYICONDATA);
    NIData.hWnd = Window;
    NIData.uID = 0;
    NIData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    NIData.uCallbackMessage = WM_USER;
    NIData.hIcon = LoadIcon(GetModuleHandle(NULL), IDI_APPLICATION);
    wcscpy(NIData.szTip, L"Тест иконки");
    Shell_NotifyIcon(NIM_ADD, &NIData);
    printf("Иконка создана.\r\n");
    cin >> i;
    Shell_NotifyIcon(NIM_DELETE, &NIData);
    return 0;
    }
    Но тем не менее, при клике на иконку ничего не происходит :( Помогите, пожалуйста. Приложение должно быть именно консольное (можно QtConsoleApplication).
    P.S. Видимо, я не первый студент, кто хотел сделать такой бонус, так как в интернете видел часто обсуждения этой проблемы, но тем не менее, нигде она полностью не решена :(
    P.P.S. Хотя эта лабораторная работа уже и прошла, и баллов за неё не получить, мне чисто из своего интереса охота решить эту проблему :facepalm: Будущему курсу пригодится :D
     
  2. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Проблему с изображением иконки частично решил:
    Код (C++):
    LoadIcon(LoadLibrary(L"shell32.dll"), MAKEINTRESOURCE(3));
    Правда, было бы супер загружать вообще собственную иконку :facepalm:
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А тебе тут без своего окна никак не обойтись. Создавай невидимое, так сказать dummy window.
     
  4. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Оо, я уж думал эта темка уплыла. Я посёрчу про dummy window, но тут есть и вторая проблема. Как загрузить собственную иконку?
    У меня есть файл .ico, в котором хранятся иконки с разрешениями от 16 x 16 до 128 x 128. Как мне эту иконку загрузить в Tray? Но, при этом, чтобы иконка у самой программы не поменялась? Желательно, это сделать как-то (не знаю как, знал бы - не спрашивал :lol:) с помощью функции LoadIcon. Также, вроде бы такое можно сделать и с помощью LoadBitmap, но у меня формат не .bmp (я не знаю, может ли грузить эта функция грузить что-то кроме bmp?), да и во-вторых, на каком-то форуме видел, что эта функция работает медленее, чем LoadIcon, и, вообще, что LoadIcon основан на LoadBitmap. Поэтому код с LoadIcon был бы предпочтительней.
    P. S. Тему уже начал обсуждать ещё и здесь, но там она осталась без ответа...
     
Загрузка...
Похожие Темы - Работа Треем Консольном
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    26
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    54
  4. lelik200969
    Ответов:
    0
    Просмотров:
    52
  5. Kozolick
    Ответов:
    0
    Просмотров:
    141

Поделиться этой страницей