{"id":471838,"date":"2025-08-23T15:12:16","date_gmt":"2025-08-23T15:12:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471838"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471838","title":{"rendered":"<span>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 CPU + RAM \u0432 \u0442\u0440\u0435\u0435. \u0427\u0430\u0441\u0442\u044c 2<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0420\u0430\u043d\u0435\u0435, \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043d\u0438\u0436\u0435). \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0435\u0435 \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c\u0438.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/928602\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0415\u0420\u0412\u0410\u042f \u0427\u0410\u0421\u0422\u042c<\/a><\/p>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c Windows. \u0420\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u0430\u043c \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0438 \u044d\u0442\u043e \u0442\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u043b\u043e.<\/p>\n<p><strong>\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u0442\u0440\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU \u0438 \u041e\u0417\u0423.<\/strong><\/p>\n<p>\u041a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434 \u0432 \u0442\u0440\u0435\u0439 \u0438\u043a\u043e\u043d\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c (\u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0410 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c)<\/p>\n<\/li>\n<li>\n<p>\u0413\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u043a \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU<\/p>\n<\/li>\n<li>\n<p>\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 (\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0438\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, + \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0422\u0430\u043a \u0432\u043e\u0442 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c. \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 .rc \u0444\u0430\u0439\u043b\u0430<\/p>\n<pre><code class=\"fsharp\">IDR_CPUICON1 ICON \"cpu4.ico\"  IDR_CPUICON2 ICON \"cpu6.ico\"  IDR_CPUICON3 ICON \"cpu5.ico\"  IDR_RAMICON0 ICON \"ram0.ico\"<\/code><\/pre>\n<p>\u0418 \u0438\u0437 Recourse.h<\/p>\n<pre><code class=\"cpp\">#define IDR_CPUICON1131  #define IDR_CPUICON2132  #define IDR_CPUICON3133  #define IDR_RAMICON0134<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043a\u043e\u043d\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<pre><code class=\"cpp\">cpu_icons[0] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON1), IMAGE_ICON, 64, 64, 0); cpu_icons[1] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON2), IMAGE_ICON, 64, 64, 0); cpu_icons[2] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON3), IMAGE_ICON, 64, 64, 0);<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041e\u0431\u0449\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043a\u043e\u043d\u043e\u043a \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 GDI. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u041d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u043b\u044c\u0444\u0430 \u043a\u0430\u043d\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e RGB. \u0418\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0431\u044b\u043b\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043d\u0430 \u0444\u043e\u043d\u0435 \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e GDI+. \u0414\u0430\u0431\u044b \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043a\u0430, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 2 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u0442\u044f\u043d\u0443\u0442\u044c \u0438\u0437 \u043d\u0435\u0435, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"cpp\">#include &lt;objidl.h&gt; #include &lt;gdiplus.h&gt;  #pragma comment(lib, \"gdiplus.lib\")<\/code><\/pre>\n<p><u>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b objidl.h \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GDI+<\/u>. \u0412\u0441\u0435 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 GDI+ \u043d\u0443\u0436\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <u>\u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u0441\u0430\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/u>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442&#187; \u0432 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440<\/p>\n<pre><code class=\"cpp\">#define ICON_SIZE 64 #define ICON_CLICK (WM_APP + 1) #define CPU_CLICK (WM_APP + 2) #define RAM_CLICK (WM_APP + 3) #define OPEN_AT_START (WM_APP + 4) #define SETTINGS_MONITOR_NAME L\"SETTINGS_MONITOR\" #define RAM_COLOR Gdiplus::Color(255, 200, 90, 240)<\/code><\/pre>\n<blockquote>\n<p><strong>ICON_SIZE<\/strong> &#8212; \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043a\u043e\u043d\u043a\u0438<br \/><strong>ICON_CLICK<\/strong> &#8212; \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0438\u043a\u043e\u043d\u043e\u043a<br \/><strong>CPU_CLICK<\/strong> &#8212; \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 checkbox CPU<br \/><strong>RAM_CLICK<\/strong> &#8212; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u041e\u0417\u0423<br \/><strong>OPEN_AT_START<\/strong> &#8212; \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u043a\u0430 \u043d\u0430 checkbox, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 &#171;\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435&#187; \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u041d\u0438\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0443\u0436\u043d\u0430<br \/><strong>SETTINGS_MONITOR_NAME<\/strong> &#8212; \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<br \/><strong>RAM_COLOR<\/strong> &#8212; \u0446\u0432\u0435\u0442 \u0438\u043a\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u041e\u0417\u0423. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432\u0430\u043c \u0446\u0432\u0435\u0442 \u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e ARGB \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e \u043f\u043e\u043b\u0435<\/p>\n<\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f checkbox \u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b checkbox.h, \u0434\u0430\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u0434. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u043c\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0447\u0435\u0440\u0435\u0437 CreateWindowEx. \u041a\u043b\u0430\u0441\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<details class=\"spoiler\">\n<summary>checkbox.h<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;windows.h&gt; #include &lt;iostream&gt; #include &lt;string&gt;  class Checkbox { private: HWND parentWindow; HMENU hMenu; bool checked; HWND hwnd; public:  Checkbox(HWND hwnd_, HINSTANCE hInstance, UINT id_, LPCWCHAR text_, UINT x, UINT y, UINT width, UINT height)  : parentWindow(hwnd_), hMenu((HMENU)id_) { hwnd = CreateWindowEx(NULL,  L\"BUTTON\",  text_,  WS_VISIBLE | WS_CHILD | BS_CHECKBOX,  x,  y,  width,  height,  parentWindow,  hMenu,  hInstance,  nullptr); UnCheck(); }  void Check() { checked = true; SendMessage(hwnd, BM_SETCHECK, checked, 0); }  void UnCheck() { checked = false; SendMessage(hwnd, BM_SETCHECK, checked, 0); }  void Block() { EnableWindow(hwnd, FALSE); }  void UnBlock() { EnableWindow(hwnd, TRUE); }  bool Status() { return checked; }  void Revers() { checked = !checked; SendMessage(hwnd, BM_SETCHECK, checked, 0); } };<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">#include \"checkbox.h\"<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">HINSTANCE hInst; WCHAR szTitle[MAX_LOADSTRING]; WCHAR szWindowClass[MAX_LOADSTRING]; HANDLE htimer_ram = NULL; HANDLE htimer_cpu = NULL; NOTIFYICONDATA cpu_status_icon; NOTIFYICONDATA ram_status_icon; MEMORYSTATUSEX mem_info; \/\/\u043d\u043e\u0432\u044b\u0435 ULONG_PTR g_gdiplusToken = 0; \/\/\u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f GDI+ std::map&lt;uint16_t, HICON&gt; hash_cpu_icons; \/\/\u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043e\u043a CPU std::map&lt;uint16_t, HICON&gt; hash_ram_icons; \/\/\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u041e\u0417\u0423  byte show_window_flag; \/\/\u0444\u043b\u0430\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u043a\u043d\u0430 0x0 - \u0441\u043a\u0440\u044b\u0442\u043e; 0x5 - \u043e\u0442\u043a\u0440\u044b\u0442\u043e byte settings_param = 0b0111; \/\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \/\/\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0431\u0438\u0442\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0432\u0441\u0435 \u043f\u043e\u043a\u0430\u0437 \u0438\u043a\u043e\u043d\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 byte cpu_show = 0x2; \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 cpu. 0x2 - \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, 0x0 -  \u0441\u043a\u0440\u044b\u0442\u043e byte ram_show = 0x2; \/\/ \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u0437\u0443  \/\/\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 3 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a Checkbox *cpu_checkbox; Checkbox *ram_checkbox; Checkbox *open_start_checkbox;<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043a\u043e\u043d\u043e\u043a<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 GDI+.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 GDI+<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void InitGDIPlus() {     Gdiplus::GdiplusStartupInput gdiplusStartupInput;     Gdiplus::GdiplusStartup(&amp;g_gdiplusToken, &amp;gdiplusStartupInput, nullptr); }  void ShutdownGDIPlus() {     if (g_gdiplusToken != 0)         Gdiplus::GdiplusShutdown(g_gdiplusToken); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043a\u043e\u043d\u043a\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>CreateIconWithNumber<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">ICON CreateIconWithNumber(int number, int size, int fontSize, Gdiplus::Color textColor) {     std::wstring text = std::to_wstring(number);      \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0438\u0442\u043c\u0430\u043f\u0443 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 PixelFormat32bppARGB - 32 \u0431\u0438\u0442\u0430 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:     \/\/\u043f\u043e 8 \u0431\u0438\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 4 \u043a\u0430\u043d\u0430\u043b\u0430 ARGB     Gdiplus::Bitmap bitmap(size, size, PixelFormat32bppARGB);      \/\/\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0432\u044b\u0432\u043e\u0434\u0430     Gdiplus::Graphics graphics(&amp;bitmap);     graphics.Clear(Gdiplus::Color(0, 0, 0, 0)); \/\/ \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0444\u043e\u043d      \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0448\u0440\u0438\u0444\u0442     Gdiplus::FontFamily fontFamily(L\"Segoe UI\");     Gdiplus::Font font(&amp;fontFamily, static_cast&lt;Gdiplus::REAL&gt;(fontSize), Gdiplus::FontStyleBold, Gdiplus::UnitPixel);     Gdiplus::SolidBrush brush(textColor);      \/\/ \u0414\u043b\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b     Gdiplus::RectF charRect;     graphics.MeasureString(L\"0\", 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);     float y = (size - charRect.Height) \/ 2.0f;      float x = 0.0f;     float spacingFactor = 0.65f; \/\/ \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 (\u0431\u043e\u043b\u044c\u0448\u0435 =&gt; \u043f\u043b\u043e\u0442\u043d\u0435\u0435)      for (wchar_t ch : text)     {         wchar_t str[2] = { ch, 0 };          \/\/ \u0418\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430         graphics.MeasureString(str, 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);          \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c (x, y), \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043e \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443         graphics.DrawString(str, 1, &amp;font, Gdiplus::PointF(x, y), &amp;brush);          \/\/ \u0421\u043c\u0435\u0449\u0430\u0435\u043c x \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430         x += charRect.Width * spacingFactor;     }      HICON hIcon = nullptr;     bitmap.GetHICON(&amp;hIcon);     return hIcon; }<\/code><\/pre>\n<p>\u0420\u0435\u0448\u0438\u043b \u0432\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437-\u0437\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0446\u0438\u0444\u0440 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0430\u0441\u044c. \u0410 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0438 \u043c\u0435\u0436\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b. \u041f\u043e-\u043c\u043e\u0435\u043c\u0443, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442: <\/p>\n<ul>\n<li>\n<p>\u0427\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0438\u043a\u043e\u043d\u043a\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 64)<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0426\u0432\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u041e\u0417\u0423<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void CALLBACK TimerRAM(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t ram_info[64];     ZeroMemory(ram_info, 64);     if (GlobalMemoryStatusEx(&amp;mem_info)) {         static uint16_t totalPhys = (uint16_t)ceil((float)mem_info.ullTotalPhys \/ 1024 \/ 1024 \/ 1024);         float physUsed = (float)(mem_info.ullTotalPhys - mem_info.ullAvailPhys) \/ 1024 \/ 1024 \/ 1024;         uint16_t usagePercent = mem_info.dwMemoryLoad;         HICON icon;         if (hash_ram_icons.find((uint16_t)usagePercent) == hash_ram_icons.end())         {             icon = CreateIconWithNumber(usagePercent, ICON_SIZE, 50, RAM_COLOR);             hash_ram_icons.insert({ (uint16_t)usagePercent, icon});         }         ram_status_icon.hIcon = hash_ram_icons[(uint16_t)usagePercent];         swprintf(ram_info, 64, L\"%.2f\\\\%u Gb   %u%%\", physUsed, totalPhys, usagePercent);         lstrcpy(ram_status_icon.szTip, ram_info);         Shell_NotifyIcon(NIM_MODIFY, &amp;ram_status_icon);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0422\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f CPU<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void CALLBACK TimerCPU(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t cpu_inf[8];     ZeroMemory(cpu_inf, 8);     double cpu_total = GetCPULoad();     HICON icon;     if (hash_cpu_icons.find((uint16_t)cpu_total) == hash_cpu_icons.end())     {         icon = CreateIconWithNumber((uint16_t)cpu_total, ICON_SIZE, 50, GetGradColor(cpu_total));         hash_cpu_icons.insert({ (uint16_t)cpu_total,  icon });     }     cpu_status_icon.hIcon = hash_cpu_icons[(uint16_t)cpu_total];     swprintf(cpu_inf, 8, L\"%.2f %%\", cpu_total);     lstrcpy(cpu_status_icon.szTip, cpu_inf);     Shell_NotifyIcon(NIM_MODIFY, &amp;cpu_status_icon); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u0411\u044b\u043b\u043e<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void CALLBACK TimerRAM(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t ram_info[128];     if (GlobalMemoryStatusEx(&amp;mem_info)) {         static uint16_t totalPhys = (uint16_t)ceil((float)mem_info.ullTotalPhys \/ 1024 \/ 1024 \/ 1024);         float physUsed = (float)(mem_info.ullTotalPhys - mem_info.ullAvailPhys) \/ 1024 \/ 1024 \/ 1024;         uint16_t usagePercent = mem_info.dwMemoryLoad;          swprintf(ram_info, 128, L\"%.2f\\\\%u Gb   %u%%\", physUsed, totalPhys, usagePercent);         lstrcpy(ram_status_icon.szTip, ram_info);         Shell_NotifyIcon(NIM_MODIFY, &amp;ram_status_icon);     }  }  void CALLBACK TimerCPU(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t cpu_inf[8];     double cpu_total = GetCPULoad();     if (cpu_total &lt; 25)         cpu_status_icon.hIcon = cpu_icons[0];     else if (cpu_total &lt; 50)         cpu_status_icon.hIcon = cpu_icons[1];     else if (cpu_total &gt;= 50)         cpu_status_icon.hIcon = cpu_icons[2];     swprintf(cpu_inf, 8, L\"%.2f %%\", cpu_total);     lstrcpy(cpu_status_icon.szTip, cpu_inf);     Shell_NotifyIcon(NIM_MODIFY, &amp;cpu_status_icon); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: &#171;\u0415\u0441\u0442\u044c \u043b\u0438 \u0438\u043a\u043e\u043d\u043a\u0430 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0445\u044d\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c n?&#187;<br \/>true &#8212; \u0411\u0435\u0440\u0435\u043c \u044d\u0442\u0443 \u0438\u043a\u043e\u043d\u043a\u0443, false &#8212; \u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438. <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0442\u0430\u0439\u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0446\u0432\u0435\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u044f\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f GetGradColor(); \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f<\/p>\n<h2>\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0434\u043b\u044f \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043b\u0430\u0432\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e. \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"LERP(A, B, t) = A + t * (B - A) \" alt=\"LERP(A, B, t) = A + t * (B - A) \" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e93\/ac2\/c4c\/e93ac2c4c249d3858f149f9c42e129d5.svg\" width=\"282\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e93\/ac2\/c4c\/e93ac2c4c249d3858f149f9c42e129d5.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e93\/ac2\/c4c\/e93ac2c4c249d3858f149f9c42e129d5.svg 781w\" loading=\"lazy\" decode=\"async\"\/><img decoding=\"async\" class=\"formula\" source=\"A &lt; B, t \u2208 [0; 1]\" alt=\"A &lt; B, t \u2208 [0; 1]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f9\/a59\/66a\/6f9a5966a79ef6bafa51554fbb101351.svg\" width=\"81\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f9\/a59\/66a\/6f9a5966a79ef6bafa51554fbb101351.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f9\/a59\/66a\/6f9a5966a79ef6bafa51554fbb101351.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0438\u0441\u043b\u043e\u043c A \u0438 B, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 t. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 <\/p>\n<p>\u041a\u0430\u043a\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 t = 0.5 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435 [0, 50]?<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"LERP(0, 50, 0.5) = 0 + 0.5 * (50 - 0) = 25\" alt=\"LERP(0, 50, 0.5) = 0 + 0.5 * (50 - 0) = 25\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3f0\/67b\/5e7\/3f067b5e7b6f9a877387e1d394d773a0.svg\" width=\"357\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3f0\/67b\/5e7\/3f067b5e7b6f9a877387e1d394d773a0.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3f0\/67b\/5e7\/3f067b5e7b6f9a877387e1d394d773a0.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430\u043c\u0438. \u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0448 \u0446\u0432\u0435\u0442? \u0412\u044b\u0434\u0435\u043b\u0438\u043c 3 \u0442\u043e\u0447\u043a\u0438<\/p>\n<ul>\n<li>\n<p>\u0417\u0435\u043b\u0435\u043d\u044b\u0439 &#8212; RGB(0, 255, 0) &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 0% \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU<\/p>\n<\/li>\n<li>\n<p>\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439 &#8212; RGB(255, 165, 0) &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 50% \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u0430\u0441\u043d\u044b\u0439 RGB(255, 0, 0) &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 100% \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0432\u0435\u0434\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<img decoding=\"async\" class=\"formula inline\" source=\" ] u = x \/ 50\" alt=\" ] u = x \/ 50\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3b\/bda\/c3b\/b3bbdac3b1470a9b7817b49cf7bbefac.svg\" width=\"82\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3b\/bda\/c3b\/b3bbdac3b1470a9b7817b49cf7bbefac.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3b\/bda\/c3b\/b3bbdac3b1470a9b7817b49cf7bbefac.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0433\u0434\u0435 x &#8212; \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c 2 \u0432\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438:<br \/>u &lt; 1 \u0438 u &gt; 1<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b <img decoding=\"async\" class=\"formula inline\" source=\"B = const = 0\" alt=\"B = const = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/3c2\/000\/efc3c2000114a6e58d7c1d6589a9f873.svg\" width=\"121\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/3c2\/000\/efc3c2000114a6e58d7c1d6589a9f873.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/3c2\/000\/efc3c2000114a6e58d7c1d6589a9f873.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b <img decoding=\"async\" class=\"formula inline\" source=\"R = 255 * min(u, 1)\" alt=\"R = 255 * min(u, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c1e\/03e\/876\/c1e03e87662d4768be8f8b2a185e6f67.svg\" width=\"167\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c1e\/03e\/876\/c1e03e87662d4768be8f8b2a185e6f67.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c1e\/03e\/876\/c1e03e87662d4768be8f8b2a185e6f67.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212;  \u0437\u0434\u0435\u0441\u044c A = 0, B = 255. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u0435 u &gt; 1, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU &gt; 50%, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u043a\u0430\u043d\u0430\u043b R \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 max \u0438 min \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b <img decoding=\"async\" class=\"formula inline\" source=\"G = 255 - 90 * min(u, 1) - 165  * max(u-1, 0)\" alt=\"G = 255 - 90 * min(u, 1) - 165  * max(u-1, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/090\/8f1\/cf1\/0908f1cf15b8d0e225252c79d1e1b50c.svg\" width=\"397\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/090\/8f1\/cf1\/0908f1cf15b8d0e225252c79d1e1b50c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/090\/8f1\/cf1\/0908f1cf15b8d0e225252c79d1e1b50c.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f GetGradColor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">Gdiplus::Color GetGradColor(double x) {     double u = x \/ 50.0;     Gdiplus::Color c(         255, \/\/alfa         int(255 * min(u, 1.0)), \/\/r         int(255 - 90 * min(u, 1.0) - 165 * max(u - 1.0, 0)), \/\/g         0);  \/\/b     return c; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435. \u041f\u043e\u044d\u0442\u0430\u043f\u043d\u043e.<br \/>\u0427\u0430\u0441\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"255 - 90 * u\" alt=\"255 - 90 * u\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c74\/053\/d57\/c74053d57c078faebdc99f276ba9a6e1.svg\" width=\"101\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c74\/053\/d57\/c74053d57c078faebdc99f276ba9a6e1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c74\/053\/d57\/c74053d57c078faebdc99f276ba9a6e1.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c G \u043a\u0430\u043d\u0430\u043b \u0434\u043e 165 \u043f\u0440\u0438 u &lt; 1, <\/p>\n<p>\u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e 0 \u043f\u0440\u0438 u &gt; 1, <img decoding=\"async\" class=\"formula inline\" source=\"165 - 165 * (u - 1)\" alt=\"165 - 165 * (u - 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/07a\/8e6\/fd6\/07a8e6fd68b6bec11fa331a508ccb867.svg\" width=\"159\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/07a\/8e6\/fd6\/07a8e6fd68b6bec11fa331a508ccb867.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/07a\/8e6\/fd6\/07a8e6fd68b6bec11fa331a508ccb867.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<h2>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438\u0434\u0435\u044e \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f settings_param. \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0431\u0438\u0442\u0430 &#8212; \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<ul>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0438\u0442 &#8212; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0443\u0441 CPU<\/p>\n<\/li>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0438\u0442 &#8212; \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0443\u0441 RAM<\/p>\n<\/li>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0435\u043d 3-\u0439 \u0431\u0438\u0442 \u0441 \u043a\u043e\u043d\u0446\u0430 &#8212; \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u041e\u0421, \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u044b, \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>InitInstance<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {    hInst = hInstance;     HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,       300, 300, 300, 300, nullptr, nullptr, hInstance, nullptr);     if (!hWnd)    {       return FALSE;    } \/\/\u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435    try    {         settings_param = ReadSettings();    }    catch (std::runtime_error &amp;msg)    {        settings_param = 0b0111;        WriteSettings();    }    \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b, \u0437\u0430\u0434\u0430\u0435\u043c \u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043e\u043a\u043d\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442    cpu_checkbox = new Checkbox(hWnd, hInstance, CPU_CLICK, L\"CPU\", 100, 50, 100, 30);    ram_checkbox = new Checkbox(hWnd, hInstance, RAM_CLICK, L\"RAM\", 100, 100, 100, 30);    open_start_checkbox = new Checkbox(hWnd, hInstance, OPEN_AT_START, L\"Open at start\", 100, 150, 110, 30); \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c GDI+    InitGDIPlus();       mem_info.dwLength = sizeof(mem_info);    \/\/\u0412\u0441\u0435 \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438,   \/\/\u0432\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0438\u0445    \/\/\u0432 \u043f\u043e\u043b\u0435 uCallbackMessage \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c   \/\/\u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443    cpu_status_icon.cbSize = sizeof(NOTIFYICONDATA);    cpu_status_icon.hWnd = hWnd;    cpu_status_icon.uID = 1;    cpu_status_icon.uCallbackMessage = ICON_CLICK;    cpu_status_icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;     ram_status_icon.cbSize = sizeof(NOTIFYICONDATA);    ram_status_icon.hWnd = hWnd;    ram_status_icon.uID = 2;    ram_status_icon.uCallbackMessage = ICON_CLICK;    ram_status_icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;  \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \/\/\u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 \u0438 \u0444\u043b\u0430\u0433\u043e\u0432    if (settings_param &amp; 0b0100)    {        show_window_flag = 5;        open_start_checkbox-&gt;Check();    }    if (settings_param &amp; 0b0010)    {        ram_show = 0;        ram_checkbox-&gt;Check();    }    if (settings_param &amp; 0b0001)    {        cpu_show = 0;        cpu_checkbox-&gt;Check();    } \/\/\u043d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0438\u0438 \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b    ShowWindow(hWnd, show_window_flag);    Shell_NotifyIcon(cpu_show, &amp;cpu_status_icon);    Shell_NotifyIcon(ram_show, &amp;ram_status_icon); \/\/\u0411\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u044b    if (!CreateTimerQueueTimer(&amp;htimer_cpu, NULL, TimerCPU, NULL, 1000, 1500, WT_EXECUTEDEFAULT))    {        std::cerr &lt;&lt; \"Error cpu timer\\n\";        return -1;    }     if (!CreateTimerQueueTimer(&amp;htimer_ram, NULL, TimerRAM, NULL, 1000, 1500, WT_EXECUTEDEFAULT))    {        std::cerr &lt;&lt; \"Error ram timer\\n\";        return -2;    }    return TRUE; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<details class=\"spoiler\">\n<summary> CALLBACK WndProc<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     switch (message)     {     case ICON_CLICK:         if (lParam == WM_LBUTTONDOWN)         {             show_window_flag ^= 5;             ShowWindow(hWnd, show_window_flag);         }         break;     case WM_CLOSE:         show_window_flag = 0;         ShowWindow(hWnd, show_window_flag);         break;     case WM_COMMAND:         if (HIWORD(wParam) == BN_CLICKED)         {             switch (LOWORD(wParam))             {                 case CPU_CLICK:                     cpu_checkbox-&gt;Revers();                     cpu_show ^= 0x2;                     settings_param ^= 0b001;                     Shell_NotifyIcon(cpu_show, &amp;cpu_status_icon);                     open_start_checkbox-&gt;UnBlock();                     WriteSettings();                     break;                 case RAM_CLICK:                     ram_checkbox-&gt;Revers();                     ram_show ^= 0x2;                     settings_param ^= 0b010;                     Shell_NotifyIcon(ram_show, &amp;ram_status_icon);                     open_start_checkbox-&gt;UnBlock();                     WriteSettings();                     break;                 case OPEN_AT_START:                     open_start_checkbox-&gt;Revers();                     settings_param ^= 0b100;                     WriteSettings();                     break;                 }                 if (!(settings_param &amp; 1) &amp;&amp; !(settings_param &amp; 2))                 {                     settings_param = 0b100;                     open_start_checkbox-&gt;Check();                     open_start_checkbox-&gt;Block();                     WriteSettings();                 }         }         break;     case WM_DESTROY:         ShutdownGDIPlus();         Shell_NotifyIcon(NIM_DELETE, &amp;cpu_status_icon);         Shell_NotifyIcon(NIM_DELETE, &amp;ram_status_icon);         DeleteTimerQueueTimer(NULL, htimer_cpu, NULL);         DeleteTimerQueueTimer(NULL, htimer_ram, NULL);         PostQuitMessage(0);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c \u0441\u043d\u0438\u0437\u0443-\u0432\u0432\u0435\u0440\u0445.<\/p>\n<blockquote>\n<p><strong>\u0411\u043b\u043e\u043a WM_DESTROY:<\/strong><\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b GDI+, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u044b.<\/p>\n<blockquote>\n<p><strong>\u0411\u043b\u043e\u043a WM_COMMAND:<\/strong><\/p>\n<\/blockquote>\n<p>wParam \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 id \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u043a\u043b\u0438\u043a. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f CPU_CLICK \u0438 RAM_CLICK (\u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0438 id \u043d\u0430\u0448\u0438\u0445 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432):<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 checkbox \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0435<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 XOR<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0448\u0435\u0439 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 settings_param<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u043a\u043e\u043d\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441 open_start_checkbox<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <u>\u0432\u0430\u0436\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439<\/u>: \u0435\u0441\u043b\u0438 \u044e\u0437\u0435\u0440 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u043f\u043e\u043a\u0430\u0437 \u043e\u0431\u043e\u0438\u0445 \u0438\u043a\u043e\u043d\u043e\u043a \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0432\u0438\u0441\u043d\u0435\u0442 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0437\u0430\u0434\u0430\u0447 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043b\u0435\u0437\u0442\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440, \u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0435\u0441\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e\u043a\u0430\u0437 \u043e\u0431\u043e\u0438\u0445 \u0438\u043a\u043e\u043d\u043e\u043a, \u0442\u043e \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0416\u0435\u0441\u0442\u043a\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 settings_param \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441. \u042d\u0442\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a \u0441 if-\u043e\u043c. <\/p>\n<blockquote>\n<p><strong>\u0411\u043b\u043e\u043a WM_CLOSE:<\/strong><\/p>\n<\/blockquote>\n<p>\u0412\u0445\u043e\u0434 \u0432 \u043d\u0435\u0433\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u043d\u0430 \u043a\u0440\u0435\u0441\u0442\u0438\u043a. \u041d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043d\u0430\u0448\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u0448\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e (\u044d\u0442\u043e \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043a\u043b\u0438\u043a). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u0440\u0435\u0441\u0442\u0438\u043a \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0440\u043e\u0435\u043c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<blockquote>\n<p><strong>\u0411\u043b\u043e\u043a ICON_CLICK:<\/strong><\/p>\n<\/blockquote>\n<p>\u041a\u0430\u043a \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e XOR \u043c\u0435\u043d\u044f\u0435\u043c \u0444\u043b\u0430\u0433 \u0438 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043e\u043a\u043d\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u044b<\/h2>\n<p>\u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u044b, \u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u0432\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u0414\u0430 \u0438 \u043e\u043d\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043c. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 WIN+R, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 \u043e\u043a\u043d\u043e regedit (\u0440\u0435\u0435\u0441\u0442\u0440 Windows) \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \\HKEY_CURRENT_USER\\Environment. \u0421\u044e\u0434\u0430 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u044b \u0435\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>WriteSettings<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">bool WriteSettings(int n) {     std::wstring valueStr = std::to_wstring(n);     HKEY hKey; \/\/\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435      if (RegOpenKeyExW(HKEY_CURRENT_USER, L\"Environment\", 0, KEY_SET_VALUE, &amp;hKey) != ERROR_SUCCESS)         return false; \/\/RegSetValueEx \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0438\u043f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u044e\u0447\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u0430. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043a\u043b\u044e\u0447\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e.      LONG result = RegSetValueEx(         hKey,         SETTINGS_MONITOR_NAME,         0,         REG_SZ,         reinterpret_cast&lt;const BYTE *&gt;(valueStr.c_str()),         static_cast&lt;DWORD&gt;((valueStr.size() + 1) * sizeof(wchar_t)));   \/\/\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043b\u044e\u0447     RegCloseKey(hKey);      if (result != ERROR_SUCCESS)         return false; \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u0440\u043e\u0430\u0434\u043a\u0430\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435     SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0,         (LPARAM)L\"Environment\",         SMTO_ABORTIFHUNG, 5000, nullptr);      return true; } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440.<\/p>\n<details class=\"spoiler\">\n<summary>ReadSettings<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">byte ReadSettings() {     HKEY hKey;     if (RegOpenKeyExW(HKEY_CURRENT_USER, L\"Environment\", 0, KEY_QUERY_VALUE, &amp;hKey) != ERROR_SUCCESS)         throw std::runtime_error(\"Couldnt open the key registry Environment\");      wchar_t buffer[4];     DWORD bufferSize = sizeof(buffer);     DWORD type = 0;      LONG result = RegQueryValueExW(         hKey,         SETTINGS_MONITOR_NAME,         nullptr,         &amp;type,         reinterpret_cast&lt;LPBYTE&gt;(buffer),         &amp;bufferSize     );      RegCloseKey(hKey);      if (result != ERROR_SUCCESS)         throw std::runtime_error(std::string(\"variable was not found\"));      if (type != REG_SZ)         throw std::runtime_error(std::string(\"variable has in incorrect format\"));      try {         return (byte)std::stoi(buffer);     }     catch (...) {         throw std::runtime_error(std::string(\"Couldnt convert the value to a number\"));     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0427\u0438\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0440\u0435\u0435\u0441\u0442\u0440\u0430<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0431\u043b\u043e\u043a\u0443 try-catche. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435, \u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0442\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0431\u0440\u043e\u0441\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0432\u0441\u0435 \u0444\u043b\u0430\u0433\u0438.<\/p>\n<pre><code class=\"cpp\">   try    {         settings_param = ReadSettings();    }    catch (std::runtime_error &amp;msg)    {        settings_param = 0b0111;        WriteSettings(settings_param);    }<\/code><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u043b \u0438\u043a\u043e\u043d\u043a\u0443 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u043a\u0440\u0430\u0441\u0438\u043b \u0432 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u043b \u0435\u0435 \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u044b .rc:<\/p>\n<pre><code class=\"cpp\">IDI_CPUSTATUSICON       ICON                    \"small_icon.ico\" IDI_SMALL               ICON                    \"small_icon.ico\"<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01d\/8c3\/aa6\/01d8c3aa612d577d20e3fcb2b084a4d0.png\" alt=\"\u0411\u0435\u0437 \u043e\u043a\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\" title=\"\u0411\u0435\u0437 \u043e\u043a\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\" width=\"452\" height=\"113\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/01d\/8c3\/aa6\/01d8c3aa612d577d20e3fcb2b084a4d0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01d\/8c3\/aa6\/01d8c3aa612d577d20e3fcb2b084a4d0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u0435\u0437 \u043e\u043a\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/191\/5ef\/0cd\/1915ef0cdd494be51ceeb185b15ffeb7.png\" alt=\"\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c CPU\" title=\"\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c CPU\" width=\"389\" height=\"430\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/191\/5ef\/0cd\/1915ef0cdd494be51ceeb185b15ffeb7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/191\/5ef\/0cd\/1915ef0cdd494be51ceeb185b15ffeb7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c CPU<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u0430, \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043c\u044b\u0441\u043b\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0435\u0435 \u043f\u0440\u043e\u0434\u0430\u0436\u0435\u0439, \u043d\u043e \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441 \u0432\u0430\u043c\u0438. \u042f \u0443\u0447\u0435\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0439. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u043e\u0435\u043c \u0433\u0438\u0442\u0445\u0430\u0431\u0435. <\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c .exe \u0432 \u043f\u0430\u043f\u043a\u0443 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u041e\u041b\u041d\u042b\u0419 \u041a\u041e\u0414<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include \"framework.h\" #include \"CPU_status_icon.h\" #include \"checkbox.h\" #include &lt;objidl.h&gt; #include &lt;gdiplus.h&gt; #include &lt;windows.h&gt; #include &lt;shellapi.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;map&gt;  #pragma comment(lib, \"gdiplus.lib\")  #pragma comment(lib, \"Ole32.lib\")  #define MAX_LOADSTRING 100 #define ICON_SIZE 64 #define ICON_CLICK (WM_APP + 1) #define CPU_CLICK (WM_APP + 2) #define RAM_CLICK (WM_APP + 3) #define OPEN_AT_START (WM_APP + 4) #define SETTINGS_MONITOR_NAME L\"SETTINGS_MONITOR\" #define RAM_COLOR Gdiplus::Color(255, 200, 90, 240)  \/\/ \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435: HINSTANCE hInst; WCHAR szTitle[MAX_LOADSTRING]; WCHAR szWindowClass[MAX_LOADSTRING]; HANDLE htimer_ram = NULL; HANDLE htimer_cpu = NULL; NOTIFYICONDATA cpu_status_icon; NOTIFYICONDATA ram_status_icon; MEMORYSTATUSEX mem_info; ULONG_PTR g_gdiplusToken = 0; std::map&lt;uint16_t, HICON&gt; hash_cpu_icons; std::map&lt;uint16_t, HICON&gt; hash_ram_icons;  byte show_window_flag; byte settings_param = 0b0111; byte cpu_show = 0x2; byte ram_show = 0x2;  Checkbox *cpu_checkbox; Checkbox *ram_checkbox; Checkbox *open_start_checkbox;   ATOM                MyRegisterClass(HINSTANCE hInstance); BOOL                InitInstance(HINSTANCE, int); LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);  Gdiplus::Color GetGradColor(double x) {     double u = x \/ 50.0;     Gdiplus::Color c(         255, \/\/alfa         int(255 * min(u, 1.0)), \/\/r         int(255 - 90 * min(u, 1.0) - 165 * max(u - 1.0, 0.0)), \/\/g         0);  \/\/b     return c; }  void InitGDIPlus() {     Gdiplus::GdiplusStartupInput gdiplusStartupInput;     Gdiplus::GdiplusStartup(&amp;g_gdiplusToken, &amp;gdiplusStartupInput, nullptr); }  void ShutdownGDIPlus() {     if (g_gdiplusToken != 0)         Gdiplus::GdiplusShutdown(g_gdiplusToken); }  HICON CreateIconWithNumber(int number, int size, int fontSize, Gdiplus::Color textColor) {     std::wstring text = std::to_wstring(number);      Gdiplus::Bitmap bitmap(size, size, PixelFormat32bppARGB);     Gdiplus::Graphics graphics(&amp;bitmap);     graphics.Clear(Gdiplus::Color(0, 0, 0, 0));      Gdiplus::FontFamily fontFamily(L\"Segoe UI\");     Gdiplus::Font font(&amp;fontFamily, static_cast&lt;Gdiplus::REAL&gt;(fontSize), Gdiplus::FontStyleBold, Gdiplus::UnitPixel);     Gdiplus::SolidBrush brush(textColor);      Gdiplus::RectF charRect;     graphics.MeasureString(L\"0\", 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);     float y = (size - charRect.Height) \/ 2.0f;      float x = 0.0f;     float spacingFactor = 0.65f;     for (wchar_t ch : text)     {         wchar_t str[2] = { ch, 0 };         graphics.MeasureString(str, 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);         graphics.DrawString(str, 1, &amp;font, Gdiplus::PointF(x, y), &amp;brush);         x += charRect.Width * spacingFactor;     }      HICON hIcon = nullptr;     bitmap.GetHICON(&amp;hIcon);     return hIcon; }  float GetCPULoad() {     static FILETIME idleTimePrev = {}, kernelTimePrev = {}, userTimePrev = {};      FILETIME idleTime, kernelTime, userTime;     if (!GetSystemTimes(&amp;idleTime, &amp;kernelTime, &amp;userTime)) return 0.0;      auto toUInt64 = [](FILETIME ft) {         return ((uint64_t)ft.dwHighDateTime &lt;&lt; 32) | ft.dwLowDateTime;         };      uint64_t idleDiff = toUInt64(idleTime) - toUInt64(idleTimePrev);     uint64_t kernelDiff = toUInt64(kernelTime) - toUInt64(kernelTimePrev);     uint64_t userDiff = toUInt64(userTime) - toUInt64(userTimePrev);      idleTimePrev = idleTime;     kernelTimePrev = kernelTime;     userTimePrev = userTime;      uint64_t total = kernelDiff + userDiff;     return total ? (1.0 - (float)idleDiff \/ total) * 100.0 : 0.0; }  void CALLBACK TimerRAM(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t ram_info[64];     ZeroMemory(ram_info, 64);     if (GlobalMemoryStatusEx(&amp;mem_info)) {         static uint16_t totalPhys = (uint16_t)ceil((float)mem_info.ullTotalPhys \/ 1024 \/ 1024 \/ 1024);         float physUsed = (float)(mem_info.ullTotalPhys - mem_info.ullAvailPhys) \/ 1024 \/ 1024 \/ 1024;         uint16_t usagePercent = mem_info.dwMemoryLoad;         HICON icon;         if (hash_ram_icons.find((uint16_t)usagePercent) == hash_ram_icons.end())         {             icon = CreateIconWithNumber(usagePercent, ICON_SIZE, 50, RAM_COLOR);             hash_ram_icons.insert({ (uint16_t)usagePercent, icon});         }         ram_status_icon.hIcon = hash_ram_icons[(uint16_t)usagePercent];         swprintf(ram_info, 64, L\"%.2f\\\\%u Gb   %u%%\", physUsed, totalPhys, usagePercent);         lstrcpy(ram_status_icon.szTip, ram_info);         Shell_NotifyIcon(NIM_MODIFY, &amp;ram_status_icon);     } }  void CALLBACK TimerCPU(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t cpu_inf[8];     ZeroMemory(cpu_inf, 8);     double cpu_total = GetCPULoad();     HICON icon;     if (hash_cpu_icons.find((uint16_t)cpu_total) == hash_cpu_icons.end())     {         icon = CreateIconWithNumber((uint16_t)cpu_total, ICON_SIZE, 50, GetGradColor(cpu_total));         hash_cpu_icons.insert({ (uint16_t)cpu_total,  icon });     }     cpu_status_icon.hIcon = hash_cpu_icons[(uint16_t)cpu_total];     swprintf(cpu_inf, 8, L\"%.2f %%\", cpu_total);     lstrcpy(cpu_status_icon.szTip, cpu_inf);     Shell_NotifyIcon(NIM_MODIFY, &amp;cpu_status_icon); }  bool WriteSettings(int n) {     std::wstring valueStr = std::to_wstring(n);     HKEY hKey;      if (RegOpenKeyExW(HKEY_CURRENT_USER, L\"Environment\", 0, KEY_SET_VALUE, &amp;hKey) != ERROR_SUCCESS)         return false;      LONG result = RegSetValueEx(         hKey,         SETTINGS_MONITOR_NAME,         0,         REG_SZ,         reinterpret_cast&lt;const BYTE *&gt;(valueStr.c_str()),         static_cast&lt;DWORD&gt;((valueStr.size() + 1) * sizeof(wchar_t)));     RegCloseKey(hKey);      if (result != ERROR_SUCCESS)         return false;      SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0,         (LPARAM)L\"Environment\",         SMTO_ABORTIFHUNG, 5000, nullptr);      return true; }  byte ReadSettings() {     HKEY hKey;     if (RegOpenKeyExW(HKEY_CURRENT_USER, L\"Environment\", 0, KEY_QUERY_VALUE, &amp;hKey) != ERROR_SUCCESS)         throw std::runtime_error(\"Couldnt open the key registry Environment\");      wchar_t buffer[4];     DWORD bufferSize = sizeof(buffer);     DWORD type = 0;      LONG result = RegQueryValueExW(         hKey,         SETTINGS_MONITOR_NAME,         nullptr,         &amp;type,         reinterpret_cast&lt;LPBYTE&gt;(buffer),         &amp;bufferSize     );      RegCloseKey(hKey);      if (result != ERROR_SUCCESS)         throw std::runtime_error(std::string(\"variable was not found\"));      if (type != REG_SZ)         throw std::runtime_error(std::string(\"variable has in incorrect format\"));      try {         return (byte)std::stoi(buffer);     }     catch (...) {         throw std::runtime_error(std::string(\"Couldnt convert the value to a number\"));     } }  int APIENTRY wWinMain(_In_ HINSTANCE hInstance,                      _In_opt_ HINSTANCE hPrevInstance,                      _In_ LPWSTR    lpCmdLine,                      _In_ int       nCmdShow) {     UNREFERENCED_PARAMETER(hPrevInstance);     UNREFERENCED_PARAMETER(lpCmdLine);      \/\/ TODO: \u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c.      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a     LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);     LoadStringW(hInstance, IDC_CPUSTATUSICON, szWindowClass, MAX_LOADSTRING);     MyRegisterClass(hInstance);      if (!InitInstance (hInstance, nCmdShow))     {         return FALSE;     }      HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CPUSTATUSICON));      MSG msg;      \/\/ \u0426\u0438\u043a\u043b \u043e\u0441\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:     while (GetMessage(&amp;msg, nullptr, 0, 0))     {         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg))         {             TranslateMessage(&amp;msg);             DispatchMessage(&amp;msg);         }     }      return (int) msg.wParam; }  ATOM MyRegisterClass(HINSTANCE hInstance) {     WNDCLASSEXW wcex;      wcex.cbSize = sizeof(WNDCLASSEX);      wcex.style          = CS_HREDRAW | CS_VREDRAW;     wcex.lpfnWndProc    = WndProc;     wcex.cbClsExtra     = 0;     wcex.cbWndExtra     = 0;     wcex.hInstance      = hInstance;     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(1));     wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);     wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_CPUSTATUSICON);     wcex.lpszClassName  = szWindowClass;     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));      return RegisterClassExW(&amp;wcex); }  BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {    hInst = hInstance;     HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,       300, 300, 300, 300, nullptr, nullptr, hInstance, nullptr);     if (!hWnd)    {       return FALSE;    }     try    {         settings_param = ReadSettings();    }    catch (std::runtime_error &amp;msg)    {        settings_param = 0b0111;        WriteSettings(settings_param);    }     cpu_checkbox = new Checkbox(hWnd, hInstance, CPU_CLICK, L\"CPU\", 100, 50, 100, 30);    ram_checkbox = new Checkbox(hWnd, hInstance, RAM_CLICK, L\"RAM\", 100, 100, 100, 30);    open_start_checkbox = new Checkbox(hWnd, hInstance, OPEN_AT_START, L\"Open at start\", 100, 150, 110, 30);     InitGDIPlus();    mem_info.dwLength = sizeof(mem_info);     cpu_status_icon.cbSize = sizeof(NOTIFYICONDATA);    cpu_status_icon.hWnd = hWnd;    cpu_status_icon.uID = 1;    cpu_status_icon.uCallbackMessage = ICON_CLICK;    cpu_status_icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;     ram_status_icon.cbSize = sizeof(NOTIFYICONDATA);    ram_status_icon.hWnd = hWnd;    ram_status_icon.uID = 2;    ram_status_icon.uCallbackMessage = ICON_CLICK;    ram_status_icon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;      if (settings_param &amp; 0b0100)    {        show_window_flag = 5;        open_start_checkbox-&gt;Check();    }    if (settings_param &amp; 0b0010)    {        ram_show = 0;        ram_checkbox-&gt;Check();    }    if (settings_param &amp; 0b0001)    {        cpu_show = 0;        cpu_checkbox-&gt;Check();    }     ShowWindow(hWnd, show_window_flag);    Shell_NotifyIcon(cpu_show, &amp;cpu_status_icon);    Shell_NotifyIcon(ram_show, &amp;ram_status_icon);     if (!CreateTimerQueueTimer(&amp;htimer_cpu, NULL, TimerCPU, NULL, 1000, 1500, WT_EXECUTEDEFAULT))    {        std::cerr &lt;&lt; \"Error cpu timer\\n\";        return -1;    }     if (!CreateTimerQueueTimer(&amp;htimer_ram, NULL, TimerRAM, NULL, 1000, 1500, WT_EXECUTEDEFAULT))    {        std::cerr &lt;&lt; \"Error ram timer\\n\";        return -2;    }    return TRUE; }  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     switch (message)     {     case ICON_CLICK:         if (lParam == WM_LBUTTONDOWN)         {             show_window_flag ^= 5;             ShowWindow(hWnd, show_window_flag);         }         break;     case WM_CLOSE:         show_window_flag = 0;         ShowWindow(hWnd, show_window_flag);         break;     case WM_COMMAND:         if (HIWORD(wParam) == BN_CLICKED)         {             switch (LOWORD(wParam))             {                 case CPU_CLICK:                     cpu_checkbox-&gt;Revers();                     cpu_show ^= 0x2;                     settings_param ^= 0b001;                     Shell_NotifyIcon(cpu_show, &amp;cpu_status_icon);                     open_start_checkbox-&gt;UnBlock();                     WriteSettings(settings_param);                     break;                 case RAM_CLICK:                     ram_checkbox-&gt;Revers();                     ram_show ^= 0x2;                     settings_param ^= 0b010;                     Shell_NotifyIcon(ram_show, &amp;ram_status_icon);                     open_start_checkbox-&gt;UnBlock();                     WriteSettings(settings_param);                     break;                 case OPEN_AT_START:                     open_start_checkbox-&gt;Revers();                     settings_param ^= 0b100;                     WriteSettings(settings_param);                     break;                 }                 if (!(settings_param &amp; 1) &amp;&amp; !(settings_param &amp; 2))                 {                     settings_param = 0b100;                     open_start_checkbox-&gt;Check();                     open_start_checkbox-&gt;Block();                     WriteSettings(settings_param);                 }         }         break;     case WM_DESTROY:         ShutdownGDIPlus();         Shell_NotifyIcon(NIM_DELETE, &amp;cpu_status_icon);         Shell_NotifyIcon(NIM_DELETE, &amp;ram_status_icon);         DeleteTimerQueueTimer(NULL, htimer_cpu, NULL);         DeleteTimerQueueTimer(NULL, htimer_ram, NULL);         PostQuitMessage(0);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c checkbox.h!!!<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/PenguinPelmen\/CPU_icon_monitoring\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0439 \u0433\u0438\u0442\u0445\u0430\u0431!<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/938430\/\"> https:\/\/habr.com\/ru\/articles\/938430\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0420\u0430\u043d\u0435\u0435, \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043d\u0438\u0436\u0435). \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0435\u0435 \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c\u0438.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/928602\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0415\u0420\u0412\u0410\u042f \u0427\u0410\u0421\u0422\u042c<\/a><\/p>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c Windows. \u0420\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u0430\u043c \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0438 \u044d\u0442\u043e \u0442\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u043b\u043e.<\/p>\n<p><strong>\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u0442\u0440\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU \u0438 \u041e\u0417\u0423.<\/strong><\/p>\n<p>\u041a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434 \u0432 \u0442\u0440\u0435\u0439 \u0438\u043a\u043e\u043d\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c (\u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0410 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c)<\/p>\n<\/li>\n<li>\n<p>\u0413\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u043a \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU<\/p>\n<\/li>\n<li>\n<p>\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 (\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0438\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, + \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0422\u0430\u043a \u0432\u043e\u0442 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c. \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 .rc \u0444\u0430\u0439\u043b\u0430<\/p>\n<pre><code class=\"fsharp\">IDR_CPUICON1 ICON \"cpu4.ico\"  IDR_CPUICON2 ICON \"cpu6.ico\"  IDR_CPUICON3 ICON \"cpu5.ico\"  IDR_RAMICON0 ICON \"ram0.ico\"<\/code><\/pre>\n<p>\u0418 \u0438\u0437 Recourse.h<\/p>\n<pre><code class=\"cpp\">#define IDR_CPUICON1131  #define IDR_CPUICON2132  #define IDR_CPUICON3133  #define IDR_RAMICON0134<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043a\u043e\u043d\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<pre><code class=\"cpp\">cpu_icons[0] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON1), IMAGE_ICON, 64, 64, 0); cpu_icons[1] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON2), IMAGE_ICON, 64, 64, 0); cpu_icons[2] = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDR_CPUICON3), IMAGE_ICON, 64, 64, 0);<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041e\u0431\u0449\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043a\u043e\u043d\u043e\u043a \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 GDI. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u041d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u043b\u044c\u0444\u0430 \u043a\u0430\u043d\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e RGB. \u0418\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0431\u044b\u043b\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043d\u0430 \u0444\u043e\u043d\u0435 \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e GDI+. \u0414\u0430\u0431\u044b \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043a\u0430, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 2 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u0442\u044f\u043d\u0443\u0442\u044c \u0438\u0437 \u043d\u0435\u0435, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"cpp\">#include &lt;objidl.h&gt; #include &lt;gdiplus.h&gt;  #pragma comment(lib, \"gdiplus.lib\")<\/code><\/pre>\n<p><u>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b objidl.h \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GDI+<\/u>. \u0412\u0441\u0435 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 GDI+ \u043d\u0443\u0436\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <u>\u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u0441\u0430\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/u>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442&#187; \u0432 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440<\/p>\n<pre><code class=\"cpp\">#define ICON_SIZE 64 #define ICON_CLICK (WM_APP + 1) #define CPU_CLICK (WM_APP + 2) #define RAM_CLICK (WM_APP + 3) #define OPEN_AT_START (WM_APP + 4) #define SETTINGS_MONITOR_NAME L\"SETTINGS_MONITOR\" #define RAM_COLOR Gdiplus::Color(255, 200, 90, 240)<\/code><\/pre>\n<blockquote>\n<p><strong>ICON_SIZE<\/strong> &#8212; \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043a\u043e\u043d\u043a\u0438<br \/><strong>ICON_CLICK<\/strong> &#8212; \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438\u0437 \u0438\u043a\u043e\u043d\u043e\u043a<br \/><strong>CPU_CLICK<\/strong> &#8212; \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 checkbox CPU<br \/><strong>RAM_CLICK<\/strong> &#8212; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u041e\u0417\u0423<br \/><strong>OPEN_AT_START<\/strong> &#8212; \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u043a\u0430 \u043d\u0430 checkbox, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 &#171;\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435&#187; \u043e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u041d\u0438\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0443\u0436\u043d\u0430<br \/><strong>SETTINGS_MONITOR_NAME<\/strong> &#8212; \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<br \/><strong>RAM_COLOR<\/strong> &#8212; \u0446\u0432\u0435\u0442 \u0438\u043a\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u041e\u0417\u0423. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432\u0430\u043c \u0446\u0432\u0435\u0442 \u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e ARGB \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e \u043f\u043e\u043b\u0435<\/p>\n<\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f checkbox \u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b checkbox.h, \u0434\u0430\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u0434. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u043c\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0447\u0435\u0440\u0435\u0437 CreateWindowEx. \u041a\u043b\u0430\u0441\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<details class=\"spoiler\">\n<summary>checkbox.h<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;windows.h&gt; #include &lt;iostream&gt; #include &lt;string&gt;  class Checkbox { private: HWND parentWindow; HMENU hMenu; bool checked; HWND hwnd; public:  Checkbox(HWND hwnd_, HINSTANCE hInstance, UINT id_, LPCWCHAR text_, UINT x, UINT y, UINT width, UINT height)  : parentWindow(hwnd_), hMenu((HMENU)id_) { hwnd = CreateWindowEx(NULL,  L\"BUTTON\",  text_,  WS_VISIBLE | WS_CHILD | BS_CHECKBOX,  x,  y,  width,  height,  parentWindow,  hMenu,  hInstance,  nullptr); UnCheck(); }  void Check() { checked = true; SendMessage(hwnd, BM_SETCHECK, checked, 0); }  void UnCheck() { checked = false; SendMessage(hwnd, BM_SETCHECK, checked, 0); }  void Block() { EnableWindow(hwnd, FALSE); }  void UnBlock() { EnableWindow(hwnd, TRUE); }  bool Status() { return checked; }  void Revers() { checked = !checked; SendMessage(hwnd, BM_SETCHECK, checked, 0); } };<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u0435\u0434\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">#include \"checkbox.h\"<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">HINSTANCE hInst; WCHAR szTitle[MAX_LOADSTRING]; WCHAR szWindowClass[MAX_LOADSTRING]; HANDLE htimer_ram = NULL; HANDLE htimer_cpu = NULL; NOTIFYICONDATA cpu_status_icon; NOTIFYICONDATA ram_status_icon; MEMORYSTATUSEX mem_info; \/\/\u043d\u043e\u0432\u044b\u0435 ULONG_PTR g_gdiplusToken = 0; \/\/\u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f GDI+ std::map&lt;uint16_t, HICON&gt; hash_cpu_icons; \/\/\u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043e\u043a CPU std::map&lt;uint16_t, HICON&gt; hash_ram_icons; \/\/\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u041e\u0417\u0423  byte show_window_flag; \/\/\u0444\u043b\u0430\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u043a\u043d\u0430 0x0 - \u0441\u043a\u0440\u044b\u0442\u043e; 0x5 - \u043e\u0442\u043a\u0440\u044b\u0442\u043e byte settings_param = 0b0111; \/\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \/\/\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0431\u0438\u0442\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0432\u0441\u0435 \u043f\u043e\u043a\u0430\u0437 \u0438\u043a\u043e\u043d\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 byte cpu_show = 0x2; \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 cpu. 0x2 - \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, 0x0 -  \u0441\u043a\u0440\u044b\u0442\u043e byte ram_show = 0x2; \/\/ \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u0437\u0443  \/\/\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 3 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a Checkbox *cpu_checkbox; Checkbox *ram_checkbox; Checkbox *open_start_checkbox;<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043a\u043e\u043d\u043e\u043a<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 GDI+.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 GDI+<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void InitGDIPlus() {     Gdiplus::GdiplusStartupInput gdiplusStartupInput;     Gdiplus::GdiplusStartup(&amp;g_gdiplusToken, &amp;gdiplusStartupInput, nullptr); }  void ShutdownGDIPlus() {     if (g_gdiplusToken != 0)         Gdiplus::GdiplusShutdown(g_gdiplusToken); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043a\u043e\u043d\u043a\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>CreateIconWithNumber<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">ICON CreateIconWithNumber(int number, int size, int fontSize, Gdiplus::Color textColor) {     std::wstring text = std::to_wstring(number);      \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0438\u0442\u043c\u0430\u043f\u0443 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 PixelFormat32bppARGB - 32 \u0431\u0438\u0442\u0430 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:     \/\/\u043f\u043e 8 \u0431\u0438\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 4 \u043a\u0430\u043d\u0430\u043b\u0430 ARGB     Gdiplus::Bitmap bitmap(size, size, PixelFormat32bppARGB);      \/\/\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0432\u044b\u0432\u043e\u0434\u0430     Gdiplus::Graphics graphics(&amp;bitmap);     graphics.Clear(Gdiplus::Color(0, 0, 0, 0)); \/\/ \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0444\u043e\u043d      \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0448\u0440\u0438\u0444\u0442     Gdiplus::FontFamily fontFamily(L\"Segoe UI\");     Gdiplus::Font font(&amp;fontFamily, static_cast&lt;Gdiplus::REAL&gt;(fontSize), Gdiplus::FontStyleBold, Gdiplus::UnitPixel);     Gdiplus::SolidBrush brush(textColor);      \/\/ \u0414\u043b\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b     Gdiplus::RectF charRect;     graphics.MeasureString(L\"0\", 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);     float y = (size - charRect.Height) \/ 2.0f;      float x = 0.0f;     float spacingFactor = 0.65f; \/\/ \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 (\u0431\u043e\u043b\u044c\u0448\u0435 =&gt; \u043f\u043b\u043e\u0442\u043d\u0435\u0435)      for (wchar_t ch : text)     {         wchar_t str[2] = { ch, 0 };          \/\/ \u0418\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430         graphics.MeasureString(str, 1, &amp;font, Gdiplus::PointF(0, 0), &amp;charRect);          \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c (x, y), \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043e \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443         graphics.DrawString(str, 1, &amp;font, Gdiplus::PointF(x, y), &amp;brush);          \/\/ \u0421\u043c\u0435\u0449\u0430\u0435\u043c x \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430         x += charRect.Width * spacingFactor;     }      HICON hIcon = nullptr;     bitmap.GetHICON(&amp;hIcon);     return hIcon; }<\/code><\/pre>\n<p>\u0420\u0435\u0448\u0438\u043b \u0432\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437-\u0437\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0446\u0438\u0444\u0440 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0430\u0441\u044c. \u0410 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0438 \u043c\u0435\u0436\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b. \u041f\u043e-\u043c\u043e\u0435\u043c\u0443, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442: <\/p>\n<ul>\n<li>\n<p>\u0427\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0438\u043a\u043e\u043d\u043a\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 64)<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0426\u0432\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 <\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043b\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u041e\u0417\u0423<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void CALLBACK TimerRAM(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t ram_info[64];     ZeroMemory(ram_info, 64);     if (GlobalMemoryStatusEx(&amp;mem_info)) {         static uint16_t totalPhys = (uint16_t)ceil((float)mem_info.ullTotalPhys \/ 1024 \/ 1024 \/ 1024);         float physUsed = (float)(mem_info.ullTotalPhys - mem_info.ullAvailPhys) \/ 1024 \/ 1024 \/ 1024;         uint16_t usagePercent = mem_info.dwMemoryLoad;         HICON icon;         if (hash_ram_icons.find((uint16_t)usagePercent) == hash_ram_icons.end())         {             icon = CreateIconWithNumber(usagePercent, ICON_SIZE, 50, RAM_COLOR);             hash_ram_icons.insert({ (uint16_t)usagePercent, icon});         }         ram_status_icon.hIcon = hash_ram_icons[(uint16_t)usagePercent];         swprintf(ram_info, 64, L\"%.2f\\\\%u Gb   %u%%\", physUsed, totalPhys, usagePercent);         lstrcpy(ram_status_icon.szTip, ram_info);         Shell_NotifyIcon(NIM_MODIFY, &amp;ram_status_icon);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0422\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f CPU<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void CALLBACK TimerCPU(PVOID pVoid, BOOLEAN TimerOrWaitFired) {     static wchar_t cpu_inf[8];     ZeroMemory(cpu_inf, 8);     double cpu_total = GetCPULoad();     HICON icon;     if (hash_cpu_icons.find((uint16_t)cpu_total) == hash_cpu_icons.end())     {         icon = CreateIconWithNumber((uint16_t)cpu_total, ICON_SIZE, 50, GetGradColor(cpu_total));         hash_cpu_icons.insert({ (uint16_t)cpu_total,  icon });     }     cpu_status_icon.hIcon = hash_cpu_icons[(uint16_t)cpu_total];     swprintf(cpu_inf, 8, L\"%.2f %%\", cpu_total);     lstrcpy(cpu_status_icon.szTip, cpu_inf);     Shell_NotifyIcon(NIM_MODIFY, &amp;cpu_status_icon); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043e\u043d\u043e<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-471838","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=471838"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471838\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471838"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471838"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}