36 / 23 / 10
Регистрация: 14.11.2013
Сообщений: 85
1

Как отлавливать сообщения для консольной программы?

24.11.2013, 22:50. Показов 1268. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь таким способом сделать. Программа компилируется без ошибок, даже вроде работает, но сообщения не ловит

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <Windows.h>
 
 
 
 
LRESULT CALLBACK WndProc(HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam);
void DrawLine();
 
 
 
int main()
{
    HWND                hWnd;
    MSG                 msg;
    LPWSTR              szClassName = L"MyClass";   // Имя класса окна
    WNDCLASSEX          wc;                         // Класс главного окна приложения
    HINSTANCE           hInstance = (HINSTANCE)GetModuleHandle(NULL);
 
 
    // Заполняем структуру класса окна
    wc.cbSize           = sizeof(wc);                           // Размер структуры (в байтах)
    wc.style            = CS_HREDRAW | CS_VREDRAW;              // Стиль класса окна
    wc.lpfnWndProc      = WndProc;                              // Указатель на функцию окна (оконную процедуру)
    wc.cbClsExtra       = 0;                                    // Число дополнительных байтов, которые должны быть распределены в конце структуры класса
    wc.cbWndExtra       = 0;                                    // Число дополнительных байтов, которые должны быть распределены вслед за экземпляром окна
    wc.hInstance        = hInstance;                            // Дескриптор экземпляра приложения, в котором находится оконная процедура для этого класса
    wc.hIcon            = LoadIcon(NULL, IDI_APPLICATION);      // Дескриптор пиктограммы
    wc.hCursor          = LoadCursor(NULL, IDC_ARROW);          // Дескриптор курсора
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);  // Дескриптор кисти, используемой для закраски фона окна
    wc.lpszMenuName     = NULL;                                 // Указатель на строку, содержащую имя меню, применяемого по умолчанию для этого класса
    wc.lpszClassName    = szClassName;                          // Имя меню
    wc.hIconSm          = LoadIcon(NULL, IDI_APPLICATION);      // Дескриптор малой пиктограммы, которая предназначена для использования в строке заголовка окна
 
 
    
    while ( GetMessage(&msg,  NULL,  0,  0) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
 
    system("pause");
    return 0;
}
 
 
 
 
 
 
 
LRESULT CALLBACK WndProc(HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
    HDC                 hDC;            // Дескриптор контекста устройства
    PAINTSTRUCT         ps;
    RECT                rect;
 
 
    switch (uMsg)
    {
        case WM_PAINT:      // Часть или вся клиентская область окна недействительна (invalid) и ее следует перерисовать
            hDC = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rect);
            DrawLine();     // !
            EndPaint(hWnd, &ps);
            break;
 
 
        case WM_CLOSE:      // Пользователь щелкнул мыщью на кнопке закрытия окна или нажал Ctrl+F4 (Обработка этого сообщения не обязательна)
            MessageBox(NULL,  L"Выйти?",  L"111",  MB_OK);
            DestroyWindow(hWnd);    // Разрушение указанного окна (hWnd)
            break;
 
 
        case WM_DESTROY:    // 
            PostQuitMessage(0);
            break;
 
 
        default:
            return DefWindowProc(hWnd, uMsg,  wParam,  lParam);
    }
 
 
    return 0;
}
 
 
 
 
 
void DrawLine()
{
    HWND                hWnd    = GetConsoleWindow();
    HDC                 hDc     = GetDC(hWnd);
    COLORREF            color   = RGB(255, 0, 0);
 
 
    for (int x=0;  x!=100;  ++x)
            SetPixel(hDc,  x,  x,  color);
}


Добавлено через 3 минуты
Например, при закрытии консоли, не появляется сообщение о подтверждении "Выйти?"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2013, 22:50
Ответы с готовыми решениями:

Как добавить иконку для консольной программы?
Можете подсказать как в visual c++ 6.0 добавить иконку для консольной программы? Уже кучу вариантов...

Как быстро сделать графический интерфейс для консольной программы под windows на С++ ?
В общем я студент прошу сориентировать по такому вопросу. У меня есть консольная программа которая...

Отлавливать сообщения Windows
Конкретно мне нужно отловить WM_SETTINGCHANGE SPI_SETWORKAREA Мне нужен пример кода.

Оболочка для консольной программы
Вот понадобилось сделать оболочку для 4х консольных прог, работающих вмесете, могу ли как-нибудь...

3
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
25.11.2013, 00:33 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
    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
0
36 / 23 / 10
Регистрация: 14.11.2013
Сообщений: 85
25.11.2013, 08:19  [ТС] 3
Цитата Сообщение от fridi Посмотреть сообщение
не хватает:
Про это я совсем забыл.) Сейчас добавил в программу, но она как то не так работает как хотелось бы.
В сообщение WM_PAINT засунул рисование линии, но она не рисуется. Хотя в функцию WndProc заходит (это будет видно если раскомментировать строчку с MessageBox() в самом начале этой функции)

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
LRESULT CALLBACK WndProc(HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
    HDC                 hDC;            // Дескриптор контекста устройства
    PAINTSTRUCT         ps;
    RECT                rect;
    int                 userAnswer;
    COLORREF            color   = RGB(255, 0, 0);
 
    //MessageBox(hWnd,  L"!!!!!!!!!!",  L"111",  MB_OK);
 
 
    switch (uMsg)
    {
        case WM_PAINT:      // Часть или вся клиентская область окна недействительна (invalid) и ее следует перерисовать
            hDC = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rect);
            
            // Красная линия
            for (int x=0;  x!=100;  ++x)
                SetPixel(hDC,  x,  x,  color);  // Почему то не хочет рисовать
 
 
            EndPaint(hWnd, &ps);
            break;
Добавлено через 4 минуты
У меня еще один вопрос по это теме есть. Может кто знает.
Пытаюсь отследить сообщения для этой программы с помощью Spy++, но выходит сообщение
Слежение за указанным окном невозможно. Доступ к потоку сообщений для этого окна запрещен Windows.
Что это означает?
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
25.11.2013, 12:26 4
Пытаюсь отследить сообщения для этой программы с помощью Spy++, но выходит сообщение
Запустите spy++ с правами администратора
1
25.11.2013, 12:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2013, 12:26
Помогаю со студенческими работами здесь

Gui для консольной программы
Всем привет. Мне надо создать gui оболочку для готовой консольной программы, чтобы пользователь...

Хоткей для консольной программы
На самом деле меня интересует AlloConsole, но я считаю что это одно и то-же. Нужен хоткей для...

Написать обёртку для консольной программы?
Есть некая консольная утилита. Чистая вин32 сишная прога, шандарашит себе в stdout текстовки, на...

Создание интерфейса для консольной программы
Имеется следующий код: using System; using System.Collections.Generic; using System.Linq;...

Добавление аргументов для консольной программы
Здравствуйте! Подскажите пожалуйста, имеется вот такая форма, все эти поля являются аргументами для...

Создание консольной программы для нахождения числа
Дано натуральное число n (n&gt;10) . Найти предпоследнее число перед n.Спасибо за любую помощь.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru