Форум программистов, компьютерный форум, киберфорум
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. Показов 9974. Ответов 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
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.09.2014, 13:45
CheckBoxClick вообще -по моему опыту- не очень надежная штука. Такое ощущение, что состояние чекбокса меняется "в процессе" работы этой подпрограммы и от этого возникают коллизии (иногда).
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.09.2014, 13:52
Цитата Сообщение от nick42 Посмотреть сообщение
CheckBoxClick вообще -по моему опыту- не очень надежная штука. Такое ощущение, что состояние чекбокса меняется "в процессе" работы этой подпрограммы и от этого возникают коллизии (иногда).
Если изображать Дану Скалли, то не должно быть ничего такого, но лично у меня сложилось впечатление, что он любит изредка сам себя нажимать.

Цитата Сообщение от Sasha Посмотреть сообщение
Всё бы ничё, но иногда программа вместо нивидимого запуска в трей пишет мне вот такую ошибку.
Как можно исправить это?
Потихоньку. Ключевое слово иногда. Следовательно надо завести какой-либо лог и везде подряд протоколировать состояние и все изменения.
Если нужно быстрое решение, то сменить (а почему бы и не попробовать) данный компонент на какой-либо другой (BitBtn, к примеру).
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.09.2014, 13:59
ПС кроме того, присваивая ему значение (.. = true), ты запускаешь обработчик OnClick; тот в свою очередь снова лезет открывать ветку реестра... . А операции с реестром - не мгновенные по времени.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.09.2014, 15:01
Цитата Сообщение от Sasha Посмотреть сообщение
Всё бы ничё, но иногда программа вместо нивидимого запуска в трей пишет мне вот такую ошибку (см.скриншот).
Как можно исправить это? Кто-нить с этим сталкивался когда-нить?
Создавать иконку в трее можно не сразу после автостарта, а спустя некоторое
время, пока оболочка (explorer.exe) не будет полностью проинициализирована.
Когда это произойдет, придет оконное сообщение "TaskbarCreated".
То же самое случается при перезапуске оболочки. Если не отреагировать на
данное сообщение, иконка потеряется.
4
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
02.09.2014, 15:24  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если нужно быстрое решение, то сменить (а почему бы и не попробовать) данный компонент на какой-либо другой (BitBtn, к примеру).
CheckBox лучше и проще. Тем более данные с рееестра он считывает чтобы поставить сам себя тогда когда я лезу в форму с настройками и при открытии этой формы в событии FormShow он и считывает значение ключа реестра чтобы поставить галочку.

Вот скриншот
Миниатюры
Нерегулярная ошибка при автозагрузке программы: "Cannot create system shell notification icon"  
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.09.2014, 16:09
Цитата Сообщение от Sasha Посмотреть сообщение
CheckBox лучше и проще
Это не гарантия работоспособности.
Но я вас ни в коем случае не отговариваю от его использования. Но лучше заведите себе булевскую переменную.
И вообще, при старте приложения, как советует Убежденный, уходите в ожидание TaskbarCreated, а по его приходу проверяйте состояние своей булевской переменной-приватного члена формы, и уже от этого вот предпринимайте дальнейшие действия (выставление галки в чекбокс, работу с реестром, прорисовку значков в трее и так далее).

И еще раз, Sasha, обращаю ваше внимание на тот факт, что лучший и простой CheckBox
Цитата Сообщение от SatanaXIII Посмотреть сообщение
любит сам себя нажимать
Положите на форму чекбокс и пропишите, как в вашем примере, ему какую-либо сигнализацию нажатия:
C++
1
2
3
4
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
ShowMessage( "Click!" );
}
Понажимайте на него, убедитесь, что событие работает.
Теперь положите на форму кнопку и пропишите в ней:
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CheckBox1->Checked = true;
}
Нажмите на кнопку и поглядите что произойдет.
В чекбоксе не просто появится флажок, произойдет событие его нажатия.

А теперь вернитесь к своему первому посту и еще раз его внимательно просмотрите.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
02.09.2014, 16:16  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
И вообще, при старте приложения, как советует Убежденный, уходите в ожидание TaskbarCreated
Честно говоря я вообще не знаю что это такое.......((((((((((((((((((((((
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.09.2014, 16:37
Цитата Сообщение от Sasha Посмотреть сообщение
что это такое
Возьмите за пример любимый UI класс-перехватчик, переопределите им класс свей стартовой формы так, чтобы она слушала событие TaskbarCreated (через карту сообщений (MESSAGE_MAP)) с помощью какого-либо WaitfFor, и, как только событие придет, продолжала работу.
Или можно попробовать залезть прям в само приложение, а не форму - подредактировать Project.cpp на предмет того же прослушивания.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.09.2014, 20:41
Цитата Сообщение от Убежденный Посмотреть сообщение
Создавать иконку в трее можно не сразу после автостарта, а спустя некоторое
время, пока оболочка (explorer.exe) не будет полностью проинициализирована.
Когда это произойдет, придет оконное сообщение "TaskbarCreated".
То же самое случается при перезапуске оболочки. Если не отреагировать на
данное сообщение, иконка потеряется.
Только, я не пойму там ручное создание иконки, или как обычно компонентом? Если компонентом то как бы отпадает "ручное создание".

Добавлено через 3 минуты
Цитата Сообщение от nick42 Посмотреть сообщение
CheckBoxClick вообще -по моему опыту- не очень надежная штука. Такое ощущение, что состояние чекбокса меняется "в процессе" работы этой подпрограммы и от этого возникают коллизии (иногда).
Это чет вообще даже не понял.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
30.09.2014, 17:36  [ТС]
Вот написал обработку сообщения TaskbarCreated. Как Вы думаете так правильно
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
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 TrayIcon1->Visible = false;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
 static UINT s_uTaskbarRestart;
 
 switch(uMessage)
  {
    case WM_CREATE:
    s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
    break;
    default:
 
  if(uMessage == s_uTaskbarRestart)
   {
     Form1->TrayIcon1->Visible = true;
   }
  }
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 WindowProc = WndProc;
 Form1->Visible = false;
 TrayIcon1->Visible = true;
}
//---------------------------------------------------------------------------
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
02.10.2014, 10:23  [ТС]
Как показала практика почему-то не заходит выполнение в функцию WndProc, потому что ShowMessage не срабатывает. Ребята подскажите, пожалуйста, как правильно?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include "tchar.h"
#pragma hdrstop
 
#include "Unit1.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 name = ExtractFileName(ChangeFileExt(Application->ExeName,""));
 Form1->Visible = false;
 //TrayIcon1->Visible = false;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
 ShowMessage("В функции");
 static UINT s_uTaskbarRestart;
 
 switch(uMessage)
  {
    case WM_CREATE:
    s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
    
    break;
    default:
 
  if(uMessage == s_uTaskbarRestart)
   {
     
     Form1->TrayIcon1->Visible = true;
   }
  }
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 
 WindowProc = WndProc;
 
 DWORD dwIndex,dwSizeName;
 TCHAR *sKey = L"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);
 }
 TrayIcon1->Visible = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Run_for_WindowsClick(TObject *Sender)
{
   TCHAR *sVarName1 = name.w_str();
   TCHAR *sKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
   UnicodeString 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)*sizeof(TCHAR))!=ERROR_SUCCESS)
           {
            RegCloseKey(hKeyResult);
           }
       }
        else
       {
          RegDeleteValue(hKeyResult, sVarName1);
          RegCloseKey(hKeyResult);
       }
     }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::N1Click(TObject *Sender)
{
 Form1->Show();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Form1->Hide();
}
//---------------------------------------------------------------------------
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
02.10.2014, 22:55
Как минимум, на момент выполнения FormCreate сообщение WM_CREATE уже получено.
Собственно оно и вызывает FormCreate.

Добавлено через 4 минуты
Да и где гарантия того, что на момент создания формы событие TaskbarCreated уже не свершилось?

Добавлено через 1 час 44 минуты
Так у меня работает:
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
//---------------------------------------------------------------------------
 
#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");
    }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
}
//---------------------------------------------------------------------------
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.10.2014, 15:00  [ТС]
FIL, Хм... странно сделал код как У вас и ничего больше. Знаю на 100%, что моя программа стоит в автозагрузке и перезагружаю компьютер. Компьютер загружается и я жду в надежде ShowMessage c надписью TaskbarCreated, но почему-то это сообщение не появляется, а открывается сразу моя форма. Что это означает? Это наверно означает, что оконное собщение не пришло на форму или как? Работаю в C++ Builder XE 4
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
03.10.2014, 15:12
Цитата Сообщение от Sasha Посмотреть сообщение
сообщение не появляется
Скорее всего (как я писал выше) на момент запуска приложения событие TaskbarCreated уже произошло.
Для проверки можно выгрузить Эксплорер и запустить его заново.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.10.2014, 16:07  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
выгрузить Эксплорер
Всмысле завершиить процес explorer.exe?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2014, 17:38
Да, а после также запустить на выполнение в диспетчере.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.10.2014, 18:15  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Да, а после также запустить на выполнение в диспетчере.
Да так работает. Так а что же тогда нужно сделать чтобы с автозапуска работало также?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
03.10.2014, 18:20
При запуске пытайся отрисовать иконку с обработкой ошибки.
Если получится, то отрисует, если нет, то отрисует при получении события TaskbarCreated.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
03.10.2014, 18:27  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
При запуске пытайся отрисовать иконку с обработкой ошибки.
Я так понял в событии FormCreate необходимо отловить ошибку создания иконки в трее через try и catch()? Верно я понял?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2014, 18:27
Помогаю со студенческими работами здесь

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 во время...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru