Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93

Реагирование на кнопку когда приложение неактивно. Выход по ESC кнопке

24.07.2022, 09:37. Показов 2201. Ответов 15

Студворк — интернет-сервис помощи студентам
Сделал так, чтобы приложение закрывалось по нажатию ESC.

C++
1
2
3
4
5
6
   while (GetMessage(&msg, NULL, 0, 0))
       {
            if (GetAsyncKeyState(VK_ESCAPE)) {COMClose(); CloseHandle(hFileLocal); PostQuitMessage(0);}//Обслуживание кнопки ESC
            TranslateMessage(&msg);
            DispatchMessage(&msg);
       }
Беда в том, что я перехожу в другое приложение и нажимаю там ESC, а закрывается написанное мной приложение. Как побороть такой эффект?

Это в int CALLBACK WinMain. Может надо было в CALLBACK WndProc?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.07.2022, 09:37
Ответы с готовыми решениями:

Реагирование собственного компонента на изменения формы (Активно/Неактивно, изменение размера)
Добрый день! Пишу собственный компонент на остове TCustomControl. Этот компонент в итоге будет располагаться на форме и ДОЛЖЕН...

Как сделать выход из приложения по кнопке выход
Привет! Имеется 3 активити. А1 - запускается при запуске приложения(анимация) А2 - меню ( с кнопкой выход) А3 - мейн...

Выход по Esc
Здравствуйте. У меня приложение с пунктом "Выход" в menuStrip. Как сделать, чтобы выход был после нажатия Esc? В свойстве ShortcutKeys...

15
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
24.07.2022, 10:04
Уберите это и обработайте сообщение WM_KEYDOWN
https://docs.microsoft.com/en-... wm-keydown
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
24.07.2022, 19:42  [ТС]
С ALT-ESC толко сворачивается. А просто с ESC не получится?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK HostWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
        {
            {COMClose(); CloseHandle(hFileLocal); PostQuitMessage(0);}
        }
        break;
 
    // ...
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;  
}
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
24.07.2022, 21:25
Вы забыли добавить обработчик для WM_DESTROY, и в нём же следует вызывать PostQuitMessage().
Должно быть так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LRESULT CALLBACK HostWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
        {
            COMClose();
            CloseHandle(hFileLocal);
            DestroyWindow(hwndMain);
        }
        break;
 
    case WM_DESTROY: 
 
        // Post the WM_QUIT message to 
         // quit the application terminate. 
 
         PostQuitMessage(0); 
         break;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;  
}
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
24.07.2022, 23:21  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы забыли добавить обработчик для WM_DESTROY, и в нём же следует вызывать PostQuitMessage().
Должно быть так:
Извините, код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LRESULT CALLBACK HostWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
        {
            COMClose();
            CloseHandle(hFileLocal);
            DestroyWindow(hWnd);
        }
        break;
 
    case WM_DESTROY: 
 
        // Post the WM_QUIT message to 
         // quit the application terminate. 
 
         PostQuitMessage(0); 
         break;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;  
}
не работает. Процессор не заходит в switch (message). Если я правильно понял, hWnd - дескриптор

C++
1
  hWnd = CreateWindow("DesktopApp", "BootLoader V2.7", WS_OVERLAPPEDWINDOW|WS_BORDER|WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 840, 480, NULL, NULL, hInstance, NULL);
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
25.07.2022, 15:55
Цитата Сообщение от Shark1978 Посмотреть сообщение
Процессор не заходит в switch (message). Если я правильно понял, hWnd - дескриптор
Покажите:
1) как вы регистрируете класс окна;
2) цикл выборки сообщений.
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
25.07.2022, 20:36  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
1) как вы регистрируете класс окна;
C++
1
   hWnd = CreateWindow("DesktopApp", "BootLoader V2.7", WS_OVERLAPPEDWINDOW|WS_BORDER|WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 840, 480, NULL, NULL, hInstance, NULL);
Цитата Сообщение от Замабувараев Посмотреть сообщение
2) цикл выборки сообщений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)         //
{                                                                                       //
    HDC hdc;                                                                            //
    LRESULT res;                                                                        //  
    PAINTSTRUCT ps;                                                                     //
    HWND hwndCheck;                                                                     //
    char NumberPort[25];                                                                //
    switch (message)                                                                    //
    {                                                                                   //
//---------------------------------------------------------------------------------------------
    case WM_PAINT:                                                                      //перерисовка окна
//---------------------------------------------------------------------------------------------
        hdc = BeginPaint(hWnd, &ps);                                                    //начало перерисовки
        EndPaint(hWnd, &ps);                                                            //конец перерисовки
        break;                                                                          //
//---------------------------------------------------------------------------------------------         
  case WM_COMMAND:                                                                      //сообщение о команде      
//--------------------------------------------------------------------------------------------- 
//Кнопка 1. Команда MakeBootFile
    if(LOWORD(wParam) == 10000)                                                         //
        {                                                                               //
            ClearMultitext();                                                           //Очищаем текстовое окно
            MakeBootFile();                                                             //
        }                                                                               //
 
//--------------------------------------------------------------------------------------------- 
//Кнопка 2. Команда Прошивка
    if(LOWORD(wParam) == 10001)                                                         //
        {                                                                               //
            ClearMultitext();                                                           //Очищаем текстовое окно
            DISKN();                                                                    //
            UpdateWindow(hWnd);                                                         //
            WriteBootFile();                                                            //
            ENKN();                                                                     //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 3. Команда Загрузка файла конфигурации
    if(LOWORD(wParam) == 10002)                                                         //
        {                                                                               //
            ClearMultitext();                                                           //Очищаем текстовое окно
            WriteConfigFile();                                                          //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 4. Команда КС в 26016
    if(LOWORD(wParam) == 10003)                                                         //
        {                                                                               //
            WriteComPort((char*)"CSUMFW\r\n", sizeof("CSUMFW\r\n") - 1);                //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 5. Команда HLT
    if(LOWORD(wParam) == 10004)                                                         //
        {                                                                               //
            WriteComPort((char*)"HLT\r\n", sizeof("HLT\r\n") - 1);                      //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 6. Сброс в прошивке
    if(LOWORD(wParam) == 10005)                                                         //
        {                                                                               //
            WriteComPort((char*)"RES\r\n", sizeof("RES\r\n") - 1);                      //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 7. Переход в Debug
    if(LOWORD(wParam) == 10006)                                                         //
        {                                                                               //
            WriteComPort((char*)"DBGBLDR\r\n", sizeof("DBGBLDR\r\n") - 1);              //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //      
//--------------------------------------------------------------------------------------------- 
//Кнопка 8. Проверка КС прошивки в CPU
    if(LOWORD(wParam) == 10007)                                                         //
        {                                                                               //
            WriteComPort((char*)"CSUMCPU\r\n", sizeof("CSUMCPU\r\n") - 1);              //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 9. переход в прошивку
    if(LOWORD(wParam) == 10008)                                                         //
        {                                                                               //
            WriteComPort((char*)"GO\r\n", sizeof("GO\r\n") - 1);                        //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 10. Загрузка FTP
    if(LOWORD(wParam) == 10009)                                                         //
        {                                                                               //
            WriteComPort((char*)"LFTP\r\n", sizeof("LFTP\r\n") - 1);                    //
            FlushFileBuffers (hComPORT);                                                //
        }                                                                               //
//--------------------------------------------------------------------------------------------- 
//Кнопка 11. Очистка окна
    if(LOWORD(wParam) == 10010)                                                         //
        {                                                                               //
            ClearMultitext();                                                           //Очищаем текстовое окно
            //UpdateWindow(hTextBOX);                                                   //hWnd
        }                                                                               //
//---------------------------------------------------------------------------------------------
//ЧекБокс записи файла
      if(LOWORD(wParam) == 10011)                                                       //Чекбокс
      {                                                                                 //
            res = SendMessage (FileCheckBox, BM_GETCHECK, 0, 0);                        //Выясняем текущее состояние chechbox'а.
            if(res == BST_CHECKED)                                                      //Если галочка стоит.   FileCheckBox
                {                                                                       //
                    DWORD RetBytes;                                                     //
                    DeleteFile("LogTX.txt");                                            //Удалить старый файл
                    HANDLE hFileLocal = CreateFileW(L"LogTX.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
                    unsigned int TextLebgth = SendMessage(hTextBOX, WM_GETTEXTLENGTH, 0, 0);//Получаем длину текста в окне
                    char *string;                                                       //Выделяем память под буфер окна
                    string = (char *)malloc(TextLebgth + 100);                          //
                    if(string == NULL) {SetWindowText(hLogWindow1, "Память не выделена"); return 0;}
                    GetWindowText(hTextBOX, string, TextLebgth);                        //Читаем в буфер весь текст из текстового окна.
                    WriteFile(hFileLocal, string, TextLebgth, &RetBytes, NULL);//Записать массив. cslen для UNICODE, strlen для ANSI
                    CloseHandle(hFileLocal);                                            //
                    wsprintf(string, "записано: %d байт", RetBytes);                    //
                    SetWindowText(hLogWindow1, string);                                 //Вывести число записаных байт
                    free(string);                                                       //
                    SendMessage(FileCheckBox, BM_SETCHECK, BST_UNCHECKED, 0);           //
                }                                                                       //
            //if(res == BST_UNCHECKED)                                                  //Если галочка стоит.   FileCheckBox
            //  {                                                                       //
            //  }                                                                       //              
      }                                                                                 //
//---------------------------------------------------------------------------------------------
//Изменение номера в Comdodox
  if(LOWORD(wParam) == 10011)                                                           //
  {                                                                                     //
    if(HIWORD(lParam) == (unsigned)CBN_ERRSPACE)                                        //
        {                                                                               //
          MessageBox(hWnd, "Мало памяти", "OK", MB_OK);                                   //
        }                                                                               //
   if(HIWORD(wParam) == CBN_SELCHANGE)                                                  //
        {                                                                               //
            int SelectedItem;                                                           //
            SelectedItem = (int)SendMessage(hComboBox, CB_GETCURSEL, 0, 0L);            //Получить номер выбранного элемента из Comdodox (число)
            if(SelectedItem != CB_ERR)                                                  //Если номер выбранного элемента из Comdodox получен правильно
                {                                                                       //
                    SendMessage(hComboBox, CB_GETLBTEXT, SelectedItem, (LPARAM)NumberPort); //Получить текст выбранного элемента из Comdodox
                    COMOpen(NumberPort);                                                //Открываем порт
                }                                                                       //
        }                                                                               //
    }                                                                                   //
    break;                                                                              //  
//---------------------------------------------------------------------------------------------
//Таймер    
    case WM_TIMER:                                                                      //Прорисовка окон класса static
//---------------------------------------------------------------------------------------------
    break;                                                                              //
//---------------------------------------------------------------------------------------------     
    case WM_DESTROY:                                                                    //
//---------------------------------------------------------------------------------------------
        COMClose();                                                                     //
        PostQuitMessage(0);                                                             //
        break;                                                                          //
   default:                                                                             //
        return DefWindowProc(hWnd, message, wParam, lParam);                            //
        break;                                                                          //
   }                                                                                    //
   return 0;                                                                            //
}
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.07.2022, 05:35
Ну это точно не регистрация класса окна и не цикл выборки сообщений.

Чтобы вы могли отобразить окно, вам нужен оконный класс. Регистрация класса окна должна быть примерно такой:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    WNDCLASSEX wcx; 
 
    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpfnWndProc = MainWndProc;     // указатель на вашу оконную процедуру
    wcx.cbClsExtra = 0;                
    wcx.cbWndExtra = 0;              
    wcx.hInstance = hinstance;     
    wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);              
    wcx.hCursor = LoadCursor(NULL, IDC_ARROW);                    
    wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);                  
    wcx.lpszMenuName =  NULL;  
    wcx.lpszClassName = "DesktopApp"; 
    wcx.hIconSm = 0; 
 
    // Register the window class. 
 
    RegisterClassEx(&wcx);
После регистрации оконного класса вы можете создать окно с таким классом:
C
1
hwnd = CreateWindowEx(параметры...)
Окно создано, теперь его надо отобразить и перерисовать:
C
1
2
ShowWindow(hwnd,nCmdShow); // отображение
UpdateWindow(hwnd);          // перерисовка
После этого идёт цикл выборки сообщений:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL bRet;
 
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // Обработка ошибки и выход
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
26.07.2022, 12:49  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
WNDCLASSEX wcx;
Наверно это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{                                                                                       //
   WNDCLASSEX 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, IDI_APPLICATION);                          //
   wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);                                   //
   wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 0);                                    //Цвет окна!!!
   wcex.lpszMenuName   = NULL;                                                          //
   wcex.lpszClassName  = "DesktopApp";                                                  //
   wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);                     //
   if (!RegisterClassEx(&wcex))                                                         //
       {                                                                                //
          MessageBox(NULL,  _T("Call to RegisterClassEx failed!"), _T("Windows Desktop Guided Tour"), NULL);
          return 1;                                                                     //
       }
Миниатюры
Реагирование на кнопку когда приложение неактивно. Выход по ESC кнопке  
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
26.07.2022, 12:53  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
После этого идёт цикл выборки сообщений
Вот в цикле обработки у меня был такой код:

C++
1
2
3
4
5
6
7
   while (GetMessage(&msg, NULL, 0, 0))                                                 //
       {                                                                                //
            if (GetAsyncKeyState(VK_ESCAPE)) {COMClose(); CloseHandle(hFileLocal); PostQuitMessage(0);} //Обслуживание кнопки ESC
            TranslateMessage(&msg);                                                     //
            DispatchMessage(&msg);                                                      //
       }                                                                                //
   return (int) msg.wParam;                                                             //
Но к сожалению, нажатие ESC в любом другом активном приложении закрывает мое приложение.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.07.2022, 13:52
Цитата Сообщение от Shark1978 Посмотреть сообщение
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 0);
Должно быть COLOR_WINDOW + 1, чтобы кисть была цветом окна, а не цветом кнопок.
Вообще во всяких COLOR_XXX всегда надо добавлять единичку перед преобразованием в кисть.

Цитата Сообщение от Shark1978 Посмотреть сообщение
if (GetAsyncKeyState(VK_ESCAPE)) {COMClose(); CloseHandle(hFileLocal); PostQuitMessage(0);} //Обслуживание кнопки ESC
Вам следует удалить эту строку и обрабатывать сообщение WM_KEYDOWN.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
26.07.2022, 13:53
Лучший ответ Сообщение было отмечено Shark1978 как решение

Решение

Shark1978, в оконной процедуре события клавиатуры не ловятся потому что в окне есть активные контролы (кнопки, поля ввода и т.д.). Все клавиатурные события отправляются текущему контролу с фокусом ввода.

Можно перехватить события до их отправки контролам и сделать нужные проверки. В MFC это называется PreTranslateMessage. Смысл в том, что у вас есть цикл обработки сообщений. GetMessage достаёт сообщение из единой очереди. А функции TranslateMessage и DispatchMessage направляют сообщения в различные окна (оконные процедуры). Клавиатурные сообщения достаются из очереди, но отправляются контролам. Нужно добавить проверки msg после GetMessage, но до TranslateMessage. Вроде такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    while (GetMessage(&msg, 0, 0, 0))
    {
        // предварительная обработка сообщений
        if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE))
        {
            DestroyWindow(mainWnd);
        }
        // стандартная обработка сообщений
        else
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
1
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
26.07.2022, 15:16  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Вроде такого:
Да, так работает. Спасибо огромное. Где пишут про такие секреты? Не подскажите?

P.S.

Надо ли в таком случае добавлять строку закрытия COM порта(он открыт)?

C++
1
2
3
4
5
        if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE))                   //PreTranslateMessage
            {
                {COMClose(); CloseHandle(hFileLocal); PostQuitMessage(0);}
                DestroyWindow(hWnd);
            }
0
2 / 2 / 0
Регистрация: 12.01.2021
Сообщений: 93
26.07.2022, 15:19  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Должно быть COLOR_WINDOW + 1, чтобы кисть была цветом окна, а не цветом кнопок.
Не очень красиво тогда получается. В стиле Windows 3.1
Миниатюры
Реагирование на кнопку когда приложение неактивно. Выход по ESC кнопке  
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
26.07.2022, 17:51
Цитата Сообщение от Shark1978 Посмотреть сообщение
Где пишут про такие секреты? Не подскажите?
Это не секреты, а базовые принципы работы виндовой оконной архитектуры. Не знаю где пишут, в книгах умных, наверное. Я все свои знания в этой области почерпнул из Интернета (msdn и т.п.).

Надо ли в таком случае добавлять строку закрытия COM порта(он открыт)?
Это уже не оконная логика, а логика вашей программы. Если вы хотите перед закрытием что-то почистить, то почистите. В каком именно месте чистить зависит от вас. PostQuitMessage и DestroyWindow в одном месте не очень корректно. PostQuitMessage помещает в очередь программы сообщение, изъятие которого (GetMessage) прервёт цикл обработки сообщений. DestroyWindow запустит штатную процедуру удаления окон. Обычно PostQuitMessage вызывают уже в конце процедуры уничтожения окон, когда оконный обработчик получает WM_DESTROY.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
06.08.2022, 19:24
Цитата Сообщение от Shark1978 Посмотреть сообщение
Не очень красиво тогда получается. В стиле Windows 3.1
Вам нужно не как красиво, а использовать системные цвета.
Вот изменится цветовая тему на ночную, и тогда весь текст окажется чёрным на чёрном.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2022, 19:24
Помогаю со студенческими работами здесь

Выход по ESC
Приветствую вас уважаемые "чатлане"! .Пишет вам "пацак". Я начал с Borland C++ 3.1. Наверное все очень просто на самом деле, но как и у...

repeat until и выход по esc
Очень нужна помощь, есть такая программа Program gim; uses crt,math; var a,b,rad,grad: real; key: char; begin clrscr; ...

Выход из цикла по Esc
Народ, помогите разобраться. Пытаюсь выйти из цикла по нажатию esc, но код не работает... int x; do{ fflush(stdin); ...

Выход по нажатию ESC
#include "stdafx.h" #include <iostream> #include <conio.h> float sum(); float razn(); float del(); float proizv(); float...

Как сделать выход по ESC
org 100h old dw 0 jmp start number dw 0 c dw 0 start: xor ax,ax mov es,ax cli


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru