• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Vadik(R)
  • Дата начала
V

Vadik(R)

Добрый вечер, форумчане!
В общем, проблема в следующем. Была лабораторная работа по операционным системам, где было дано необязательно бонусное задание - свернуть консольное приложение в трей и развернуть его при клике по иконке. Вот свернуть окно в трей получилось почти без проблем. Проблема номер один - иконка в трее всегда прозрачная, какие бы параметры я не писал в функцию
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
 
V

Vadik(R)

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

lazybiz

А тебе тут без своего окна никак не обойтись. Создавай невидимое, так сказать dummy window.
 
V

Vadik(R)

Оо, я уж думал эта темка уплыла. Я посёрчу про dummy window, но тут есть и вторая проблема. Как загрузить собственную иконку?
У меня есть файл .ico, в котором хранятся иконки с разрешениями от 16 x 16 до 128 x 128. Как мне эту иконку загрузить в Tray? Но, при этом, чтобы иконка у самой программы не поменялась? Желательно, это сделать как-то (не знаю как, знал бы - не спрашивал :lol:) с помощью функции LoadIcon. Также, вроде бы такое можно сделать и с помощью LoadBitmap, но у меня формат не .bmp (я не знаю, может ли грузить эта функция грузить что-то кроме bmp?), да и во-вторых, на каком-то форуме видел, что эта функция работает медленее, чем LoadIcon, и, вообще, что LoadIcon основан на LoadBitmap. Поэтому код с LoadIcon был бы предпочтительней.
P. S. Тему уже начал обсуждать ещё и здесь, но там она осталась без ответа...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!