Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/50: Рейтинг темы: голосов - 50, средняя оценка - 4.96
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Нерегулярная ошибка при автозагрузке программы: "Cannot create system shell notification icon"

02.09.2014, 12:03. Показов 10350. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Ребята, подскажите, по такому вопросу у меня есть программа которая была написана мной ещё 2 года назад. В этой программе я предусмотрел запуск самой программы при старте Windows в свёрнутом в трей виде. Всё бы ничё, но иногда программа вместо нивидимого запуска в трей пишет мне вот такую ошибку (см.скриншот).
Как можно исправить это? Кто-нить с этим сталкивался когда-нить?

Вот код как устанавливаю автозапуск по нажатию на CheckBox...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TOptions::Run_for_WindowsClick(TObject *Sender)
{
   TCHAR *sVarName1 = name.c_str();
   TCHAR *sKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
   AnsiString text = ExtractFilePath(Application->ExeName)+ExtractFileName(Application->ExeName);
   TCHAR *sVal = text.c_str();
   HKEY hKeyResult = NULL;
   LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,sKey,0,KEY_ALL_ACCESS,&hKeyResult);
   if (rc == ERROR_SUCCESS)
     {
        if (Run_for_Windows->Checked)
       {
            if(RegSetValueEx(hKeyResult,sVarName1,0,REG_SZ,(BYTE*)sVal,lstrlen(sVal))!=ERROR_SUCCESS)
           {
            RegCloseKey(hKeyResult);
           }
       }
        else
       {
          RegDeleteValue(hKeyResult, sVarName1);
          RegCloseKey(hKeyResult);
       }
     }
}
Считывание из реестра автозапуска

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 DWORD dwIndex,dwSizeName;
 TCHAR *sKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run",sParamName[80];
 HKEY hKeyResult = NULL;
 LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,sKey,0,KEY_ALL_ACCESS,&hKeyResult);//получение параметров данного данного ключа
 
 if (rc == ERROR_SUCCESS)
 {
    for(dwIndex = 0;;dwIndex++)
    {
      dwSizeName = 80;
      if(RegEnumValue(hKeyResult,dwIndex,sParamName,&dwSizeName,NULL,NULL,NULL,NULL)!=ERROR_SUCCESS)
      {
       break;
      }
       if(AnsiString(sParamName)==name)
       {
         Run_for_Windows->Checked = true;
       }
    }
 
  RegCloseKey(hKeyResult);
 }
 else
 {
  ShowMessage("Ошибка считывания параметра запуска из реестра: "+SysErrorMessage(GetLastError()));
 }
 //---------------------------------------------------------------------
Заранее благодарен
Миниатюры
Нерегулярная ошибка при автозагрузке программы: "Cannot create system shell notification icon"  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2014, 12:03
Ответы с готовыми решениями:

cannot create shell notification icon
Есть самописная программа, которая ведет учёт прихода\ухода людей путем сканирования карточек. Иногда при считывании карточки виндовс...

Рисуем иконку для Notification.Builder setSmallIcon(int icon)
Что для этого нужно? Можно ли зарегистрировать свой ресурс - картинку из памяти (сам рисую). setSmallIcon требует int - код картинки из...

Ошибка при запуске программы Failed to create OpenGL context for format QSurFaceFormat
Не могу запускать программу Spark ar studio выдет ошибку: Failed to create OpenGL context for format QSurFaceFormat прикреплю скриншот....

33
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
03.10.2014, 18:27
Студворк — интернет-сервис помощи студентам
Да.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2014, 20:19
Ты компонент TTrayIcon используешь?
Версия билдера?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.10.2014, 23:10  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ты компонент TTrayIcon используешь?
Да использую. Версия билдера XE4
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2014, 23:10
Тогда должно нормально работать и так, не стоит мудрить.
Тут либо ничего нельзя сделать, либо оно не работает именно из-за твоего кривого кода.
Попробуй на чистом проекте с минимум кода.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2014, 11:22  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Попробуй на чистом проекте с минимум кода.
Avazart, попробовал на чистом проекте без моего как Вы выразились кривого кода, тоже самое, что и было. Сообщение не выводило при старте

Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
UINT TBC;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(Winapi::Messages::TMessage &Message)
{
    TForm::WndProc(Message);
    if (Message.Msg == TBC)
    {
        ShowMessage("TaskbarCreated");
        TrayIcon1->Visible = true;
    }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
}
//---------------------------------------------------------------------------
h-файл
C++
1
2
3
4
5
6
7
8
9
10
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TTrayIcon *TrayIcon1;
    void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall WndProc(Winapi::Messages::TMessage &Message);
};
В главном файле

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TForm1), &Form1);
 
        ShowWindow(Application->Handle,SW_HIDE);
        Application->ShowMainForm = false;
 
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
    return 0;
}
//---------------------------------------------------------------------------
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2014, 15:14
Нафига определять свою WndProc ? Да и эта штука
C++
1
TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
непонятно зачем.

Добавлено через 36 минут
Такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Application->ShowMainForm= false;
    Visible= false;
    // Cледующее можно выставить в инспекторе
    TrayIcon1->OnClick=             &AcSetTrayVisibleExecute;
    ApplicationEvents1->OnMinimize= &AcSetTrayVisibleExecute;
}
//---------------------------------------------------------------------------
// Созданный Action в ActionList
void __fastcall TForm1::AcSetTrayVisibleExecute(TObject *Sender)
{
    //TrayIcon1->Visible= !TrayIcon1->Visible;
    Visible= !Visible;
 
    if(Visible)
    {
        WindowState = wsNormal;
        Application->BringToFront();
    }
    else
    {
        WindowState = wsMinimized;
    }
}
//---------------------------------------------------------------------------
у тебя нормально работает?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2014, 16:08  [ТС]
Avazart, создал метод AcSetTrayVisibleExecute в испекторе объектов я поставил Visible = true TrayIcon1. Запустил проект нормально. Форма получилась в скрытом виде и возле часов появилась иконка. Затем я перезагрузил компьютер, что бы посмотреть как запустить ся с автозапуска программа потому как она прописана в реестре. Программа запустилась вернее в процессах есть мой проект, а вот иконки возле часов я не увидел.

Avazart, у меня к Вам вопрос как создавали Action в ActionList как обычный метод или как-то по другому?

Заранее благодарен за ответ.

Кстати заметил, что в коде нигде не прописано видимость иконки возле часов, поэтому пришлось в инспекторе выставлять иначе и при обычном запуске иконки не видно, не то что уж после перезагрузки
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2014, 16:16
Цитата Сообщение от Sasha Посмотреть сообщение
Затем я перезагрузил компьютер, что бы посмотреть как запустить ся с автозапуска программа потому как она прописана в реестре.
Каком еще на ... реестре? Говорил же про минимальный код, ничего лишнего.

Цитата Сообщение от Sasha Посмотреть сообщение
Кстати заметил, что в коде нигде не прописано видимость иконки возле часов, поэтому пришлось в инспекторе выставлять иначе и при обычном запуске иконки не видно, не то что уж после перезагрузки
Естественно.

Добавлено через 1 минуту
Цитата Сообщение от Sasha Посмотреть сообщение
Avazart, у меня к Вам вопрос как создавали Action в ActionList как обычный метод или как-то по другому?
Как обычный экшен.

Добавлено через 2 минуты
Цитата Сообщение от Sasha Посмотреть сообщение
Программа запустилась вернее в процессах есть мой проект, а вот иконки возле часов я не увидел.
Что у тебя за винда?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2014, 16:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Что у тебя за винда?
ХР
Цитата Сообщение от Avazart Посмотреть сообщение
Каком еще на ... реестре? Говорил же про минимальный код, ничего лишнего.
Я кроме твоего кода ничего не писал это у меня с предыдущей версии имя файла прописано так мне и надо потому как для меня главное чтобы с автозапуска программа запускалась без ошибки на иконку в возле часов.
Цитата Сообщение от Avazart Посмотреть сообщение
Как обычный экшен.
Извини, а как обычный экшен создаётся ? С ApplicationEvents1 я мало работал.


Ещё раз повторяю что мне нужно. Мне нужно чтобы программа запускалась с автозапуска в свёрнутом виде в трей т.е чтобы была иконка возле часо и не выдавало ошибку такую как на скриншоте кто му же она плавающая эта ошибка раз появится, а другой раз может и не появится (см. скриншот). Вот собственно над этой проблемой я борюсь!!!
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
06.10.2014, 16:38
Sasha, так предложенный мною вариант работает или нет?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2014, 16:40
Цитата Сообщение от Sasha Посмотреть сообщение
ХР
Ну это вероятно и возможная причина.

Цитата Сообщение от Sasha Посмотреть сообщение
Я кроме твоего кода ничего не писал это у меня с предыдущей версии имя файла прописано так мне и надо потому как для меня главное чтобы с автозапуска программа запускалась без ошибки на иконку в возле часов.
Попробуй сделать автозапуск не через реестр(с реестра убери), а через добавления в папку автозапуск.

Цитата Сообщение от Sasha Посмотреть сообщение
Извини, а как обычный экшен создаётся ?
Кликаешь на ActionList открывается окно там список итемов(экшенов) создаешь свой, кликаеш на него появляется обработчик в коде(метод), пишешь туда код.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2014, 16:59  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Sasha, так предложенный мною вариант работает или нет?
Нет не работает он работает когда я сам отключаю эксплорер, а потом включаю и тогда я вижу шоумесадж с надписью TaskbarCreated. А с автозапуска нет. Через исключение я ещё не делал

Добавлено через 17 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это вероятно и возможная причина.
А что под семёркой работает безукоризненно?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2014, 18:28
Цитата Сообщение от Sasha Посмотреть сообщение
А что под семёркой работает безукоризненно?
Я такой лажи не замечал пока, у меня под cемеркой две программы в трее, но грузятся они с автозапуска (через ярлыки)

Но есть, одно НО, подобная ошибка иногда возникает при сильной загрузке системы(например при запуске системы) когда кликаеш по иконке в трее что бы "вызвать" программу с трея, наблюдается весьма редко -вероятно это либо глюк компонента или самой системы.

Добавлено через 9 минут
Цитата Сообщение от Avazart Посмотреть сообщение
подобная ошибка
Имею ввиду окошко с ошибкой.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
17.10.2014, 10:11  [ТС]
Вот нашёл такой метод решения проблемы пока работает безукоризненно

C++
1
2
3
4
5
6
7
8
9
10
Timer3->Interval = 1000;
void __fastcall TProgress::Timer3Timer(TObject *Sender)
{
   if(FindWindow("Progman",0))
   {
    AddIcon();
    Timer3->Enabled = false;
    
   }
}
Функция AddIcon() описана вот здесь Создание иконки не через компонент TrayIcon

FindWindow("Progman",0) - вот эта функция ищет окно программы Explorer.exe и при его нахождении показывает иконку. Таймер установлен на интервал 1 секунда, т.е каждую секунду FindWindow будет пытаться найти программу Explorer.exe и после её нахождения таймер отключится сам. Progman - это имя класса окна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2014, 10:11

Chrome notification create - русский язык и utf8
&lt;script&gt; function notifyMe() { if (Notification.permission !== &quot;granted&quot;) Notification.requestPermission(); var...

System Error - ошибка при компиляции программы.
Помогите, пожалуйста разобраться с ошибкой. Проект VB (база данных, DAO 3,51) изначально создавался на компьютере с OS Windows95, где все...

Не загружаються настройки с Ini при автозагрузке программы
Привет! делаю программу которая должна работать постоянно и, соответственно, сама грузиться после загрузки виндовса. Вот что у меня...

При автозагрузке программы, не восстанавливаются настройки из config.ini
Ситуация такая, при обычном запуске программы, все прекрасно работает, все настройки, находящиеся в файле config.ini, восстанавливаются, в...

Нежелательное мелькание всех форм программы при автозагрузке
nXIBRY90z5w Этот короткий видеоролик демонстрирует нежелательную (преждевременную) прорисовку всех форм приложения Windows Forms во время...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru