Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 2 / 0
Регистрация: 20.01.2017
Сообщений: 52
1

Вывести количество кликов мыши

22.08.2017, 16:11. Показов 4828. Ответов 4
Метки нет (Все метки)

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#define UNICODE
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <tchar.h>
 
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
TCHAR szClassWindow[]=TEXT("Мое окно");  /* Имя класса окна */
TCHAR str1[]=TEXT("Количество раз нажатий левой клавиши мыши %d");
TCHAR str2[]=TEXT("Количество раз нажатий правой клавиши мыши %d");
TCHAR str3[]=TEXT("Количество раз двойных нажатий левой клавиши мыши %d");
TCHAR str4[]=TEXT("Количество раз двойных нажатий правой клавиши мыши %d");
int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszArgs,int nWinMode)
{
    HWND hwnd;
    MSG msg; 
    WNDCLASSEX wcl;
 
    /* 1. Определение класса окна  */
    wcl.cbSize = sizeof (wcl);  // размер структуры WNDCLASSEX 
    wcl.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;   // окно сможет получать сообщения о двойном щелчке (DBLCLK)
    wcl.lpfnWndProc = WindowProc;   // адрес оконной процедуры
    wcl.cbClsExtra = 0;     // используется Windows 
    wcl.cbWndExtra  = 0;    // используется Windows 
    wcl.hInstance = hThisInst;  // дескриптор данного приложения
    wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);    // загрузка стандартной иконки
    wcl.hCursor = LoadCursor(NULL, IDC_ARROW);      // загрузка стандартного курсора
    wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);   //заполнение окна белым цветом         
    wcl.lpszMenuName = NULL;    // приложение не содержит меню
    wcl.lpszClassName = szClassWindow;  // имя класса окна
    wcl.hIconSm = NULL; // отсутствие маленькой иконки для связи с классом окна
 
 
    /*заполнение окна белым цветом*/
    wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  
 
    /*Зарегистрировать класс окна*/
    if(!RegisterClassEx(&wcl))
        return 0;
 
    /*Создать окно*/
    hwnd = CreateWindowEx(
        0,      // расширенный стиль окна
        szClassWindow,  // имя класса окна
        TEXT("Счетчик кликов мыши"),   // заголовок окна
        /* Заголовок, рамка, позволяющая менять размеры, системное меню,
        кнопки развёртывания и свёртывания окна  */
        WS_OVERLAPPEDWINDOW,    // стиль окна
        CW_USEDEFAULT,  // х-координата левого верхнего угла окна
        CW_USEDEFAULT,  // y-координата левого верхнего угла окна
        CW_USEDEFAULT,  // ширина окна
        CW_USEDEFAULT,  // высота окна
        NULL,           // дескриптор родительского окна
        NULL,           // дескриптор меню окна
        hThisInst,      // идентификатор приложения, создавшего окно
        NULL);      // указатель на область данных приложения
 
    /*Показать окно и перерисовать содержимое*/
    ShowWindow(hwnd,nWinMode);
    UpdateWindow(hwnd);
 
    /*Запустить цикл обработки сообщений*/
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);                  /*Разрешить использование клавиатуры*/
        DispatchMessage(&msg);                    /*Вернуть управление Windows*/
    }
    return msg.wParam;
}
 
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT paintstruct;
    int a=0,b=0,c=0,d=0;
    wchar_t sBuf1[81]; 
    wchar_t sBuf2[81]; 
    wchar_t sBuf3[81]; 
    wchar_t sBuf4[81]; 
    hdc=BeginPaint(hwnd,&paintstruct);/*получить DC*/
    wsprintf(sBuf1, str1, a);
    wsprintf(sBuf2, str2, c);
    wsprintf(sBuf3, str3, b);
    wsprintf(sBuf4, str4, d);
    TextOut(hdc,1,1,str1,wcslen(str1));
    TextOut(hdc,1,20,str2,wcslen(str2));
    TextOut(hdc,1,40,str3,wcslen(str3));
    TextOut(hdc,1,60,str4,wcslen(str4));/*вывести буфер на экран*/
    EndPaint(hwnd,&paintstruct);
    switch(message)
    {
    case WM_RBUTTONDOWN:               /*Нажата правая кнопка мыши*/
        {
            a++;
        break;
        }
 
    case WM_RBUTTONDBLCLK:             /*Двойной щелчок на правой кнопке мыши*/
        {
            b++;    
        break;  
        }
 
    case WM_LBUTTONDOWN:               /*Нажата левая кнопка мыши*/
        {
            c++;    
        break;
        }
 
    case WM_LBUTTONDBLCLK:             /*Двойной щелчок на левой кнопке мыши*/
        {
            d++;       
        break;   
        } 
    case WM_DESTROY:                /*завершение программы*/
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2017, 16:11
Ответы с готовыми решениями:

Подсчет количества "кликов" левой, правой и средней кнопки мыши
Написать приложение в котором ведется подсчет количества &quot;кликов&quot; левой, правой и средней кнопки...

Посчитать количество кликов мышкой за 10 с
В таймере прописан данный код, но считает неправильно, т.к. значение переменной увеличивается,...

Написать кликер, осуществляющий n-ое количество кликов за определенное время
Всем привет! Нужна помощь... Не опытен в работе С++ Нужно задать координаты мыши допустим в 2...

в p вывести количество кликов мыши
$('#p').click (function() { for(var i=0; i&lt;; i++){ $('#p').val(i); } });

4
Software Developer
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,330
22.08.2017, 16:26 2
XoPToN, BeginPaint, EndPaint нужно обрабатывать в WM_PAINT.

Цитата Сообщение от XoPToN Посмотреть сообщение
Обновляемую статистику необходимо выводить в заголовок окна.
Цитата Сообщение от XoPToN Посмотреть сообщение
Что я сделал не так?
Не так то, что вы не выводите в заголовок. Что бы выводить в заголовок надпись воспользуйтесь SetWindowText
0
1 / 2 / 0
Регистрация: 20.01.2017
Сообщений: 52
22.08.2017, 16:37  [ТС] 3
Цитата Сообщение от decrement Посмотреть сообщение
Не так то, что вы не выводите в заголовок. Что бы выводить в заголовок надпись воспользуйтесь SetWindowText
Внес изменения,но все равно вместо количества кликов показывает %d

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
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT paintstruct;
    int a=0,b=0,c=0,d=0;
    wchar_t sBuf1[81]; 
    wchar_t sBuf2[81]; 
    wchar_t sBuf3[81]; 
    wchar_t sBuf4[81]; 
    switch(message)
    {
    case WM_PAINT:
        {
            hdc=BeginPaint(hwnd,&paintstruct);/*получить DC*/
            wsprintf(sBuf1, str1, a);
            wsprintf(sBuf2, str2, c);
            wsprintf(sBuf3, str3, b);
            wsprintf(sBuf4, str4, d);
            EndPaint(hwnd,&paintstruct);
            break;
        }
    case WM_RBUTTONDOWN:               /*Нажата правая кнопка мыши*/
        {
            a++;
            break;
        }
 
    case WM_RBUTTONDBLCLK:             /*Двойной щелчок на правой кнопке мыши*/
        {
            b++;    
            break;  
        }
 
    case WM_LBUTTONDOWN:               /*Нажата левая кнопка мыши*/
        {
            c++;    
            break;
        }
 
    case WM_LBUTTONDBLCLK:             /*Двойной щелчок на левой кнопке мыши*/
        {
            d++;       
            break;   
        } 
    case WM_DESTROY:                /*завершение программы*/
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
}
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
22.08.2017, 17:17 4
зачем вы это пишете?
C++
1
#define UNICODE
У вас "зоопарк" кодировок (а может и нет, мы ведь не знаем как вы настроили проект): вы одновременно используете и TCAHR с макросами из winapi (типа TextOut), и wchar_t с wsprintf. Надо определиться, использовать универсальные (зависимые от настроек проекта) типы/функции или остановиться на чём-то одном (мультибайт или широкие символы)
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
22.08.2017, 17:46 5
Лучший ответ Сообщение было отмечено XoPToN как решение

Решение

XoPToN, в ANSI кодировке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <windows.h>
 
char szTitle[80];
char *pWindowClass = "MouseCountClass";
int l, r, ld, rd;
 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 
void SetTitle(void)
{
    wsprintf(szTitle, "l=%d, r=%d, ld=%d, rd=%d", l, r, ld, rd);
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    MSG msg;
 
    MyRegisterClass(hInstance);
 
    if (!InitInstance (hInstance, nCmdShow)) 
        return FALSE;
 
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX); 
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = pWindowClass;
    wcex.hIconSm        = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
 
    return RegisterClassEx(&wcex);
}
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   SetTitle();
 
   hWnd = CreateWindow(pWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
      return FALSE;
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
 
        case WM_LBUTTONDOWN:
            l++;
            SetTitle();
            SetWindowText(hWnd, szTitle);
            break;
 
        case WM_RBUTTONDOWN:
            r++;
            SetTitle();
            SetWindowText(hWnd, szTitle);
            break;
 
        case WM_LBUTTONDBLCLK:
            ld++;
            SetTitle();
            SetWindowText(hWnd, szTitle);
            break;
 
        case WM_RBUTTONDBLCLK:
            rd++;
            SetTitle();
            SetWindowText(hWnd, szTitle);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
0
22.08.2017, 17:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2017, 17:46
Помогаю со студенческими работами здесь

Эмуляция кликов мыши
Ребята, помогите написать простой макрос в VBA, встроенном в экселе. Необходимо следующее: при...

Перехват кликов мыши глобально
Есть таймер с интервалом 1мс, при каждом тике он добавляет элемент типа int в list&lt;int&gt;, хочу чтобы...

Имитация кликов мыши в системе
(ищу для автоматизации действий в фоне) имитация нажатий клавиш работает наура, для теста простое...

Имитация кликов многокнопочной мыши
Подобные темы поднимались неоднократно. Но все-таки. Мои познания в программировании смешны и...


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

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