С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22

Как в этом коде послать сообщение о правом клике окну и ничего не сломать?

27.02.2020, 16:59. Показов 1057. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья помогите пожалуйста. Использовал чужой код для обучения. Выделение области в муз. программе Рипер. Должно работать так :


Но мне нужно что бы одновременно с нажатием левой кнопки нажималась правая.Но когда добавляю SendMessage весь код ломается. Со строчки 44 перестает работать.Уверен что запутался в трех соснах, буду очень благодарен за помощь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
LRESULT CALLBACK ASWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 
    static RECT rDraw;
    static POINT pStart;
 
 
    if (StartSelecting)
    {
 
        static bool bMBDown = false;
 
        if (uMsg == WM_LBUTTONDOWN) 
        {
            m("WM_LBUTTONDOWN");
            pStart.x = pStart.y = 0;
            rArea.left = rArea.top = rArea.right = rArea.bottom = 0;
            rDraw.left = rDraw.top = rDraw.right = rDraw.bottom = 0;
            TypeOf_AS = 0;
            ResetAS();
            GetArrLanesInfo();
            GetCursorPos(&pStart);
            if (Alt_Select == false)
            {
                pStart.x = SnapPix(pStart.x);
                SnappedStart = true;
            }
            else
            {
                SnappedStart = false;
            }
            ScreenToClient(hwnd, &pStart);
            SetCapture(hwnd);
 
 
            bMBDown = true;
            
            //SendMessage(hwnd, WM_RBUTTONDOWN, 0, MAKELPARAM((UINT)(pStart.x), (UINT)(pStart.y))); //Если ставлю послать сообщение окну
            
        }
 
        
 
        if (uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONDOWN)   // то вот эта часть не работает
        {
            m("key");
            RECT UP;
            GetClientRect(hwnd, &UP);
            InvalidateRect(hwnd, &UP, false);
 
            POINT p;
            GetCursorPos(&p);
            if (Alt_Select == false)
            {
            p.x = SnapPix(p.x);
            SnappedEnd = true;
            }
            else
            {
                SnappedEnd = false;
            }
            ScreenToClient(hwnd, &p);
            if (!bMBDown)
                pStart = p;
            CreateAreaRect(hwnd, &rArea, &pStart, &p);
            int y;
            TrackOrEnvAtPoint(hwnd, p.x, rArea.top, &y, NULL);
            rArea.top = y;
            TrackOrEnvAtPoint(hwnd, p.x, rArea.bottom, NULL, &y);
            rArea.bottom = y;
            rArea.right++;
            RECT scr;
            GetClientRect(hwnd, &scr);
            if (rArea.left < 0) rArea.left = 0;
            if (rArea.right > (scr.right - scr.left)) rArea.right = (scr.right - scr.left);
#ifdef _WIN32
 
 
 
#else
            RECT r, rDraw = rArea;
            GetClientRect(hwnd, &r);
            if (rDraw.left < r.left)   rDraw.left = r.left;  // You'd think IntersectRect would work here, but it doesnt for some reason.
            if (rDraw.right > r.right)  rDraw.right = r.right;
            if (rDraw.top < r.top)    rDraw.top = r.top;
            if (rDraw.bottom > r.bottom) rDraw.bottom = r.bottom;
            SWELL_DrawFocusRect(hwnd, &rDraw, &pFocusRect);
#endif      
            
            return 0;
        }
        // Done with the select
    
 
 
        else if (uMsg == WM_LBUTTONUP)
        {
            m("up");
            
            if (GetCapture() == hwnd)
            ReleaseCapture();
            StartSelecting = false;
            bMBDown = false;
            SaveArea(rArea);
 
            St_Time = PixToTime(rArea.left, SnappedStart);
            En_Time = PixToTime(rArea.right, SnappedEnd);
 
 
 
 
 
            return 0;
        }
 
    }
 
 
    
 
    if (uMsg == WM_PAINT)
    {
        
        HDC dc = GetDC(hwnd);
        if (!dc)
            return 0;
 
        if (TypeOf_AS == 1)
            UpdateArea();
 
 
        // Get the entire screen
        if (!bmStd)
        {
            RECT r;
            GetClientRect(hwnd, &r);
            bmStd = new LICE_SysBitmap(1, 1);
        }
 
        RECT r;
        GetClientRect(hwnd, &r);
        InvalidateRect(hwnd, &rArea, false);
        LRESULT result = AreaSelectionWndProc(hwnd, uMsg, wParam, lParam);
        LICE_Clear(bmStd, 0x1432D2DC);
        HDC bitmapDC = bmStd->getDC();
 
        
#ifdef _WIN32
        if (AlphaBlend(dc, rArea.left, rArea.top, (rArea.right - rArea.left), rArea.bottom - rArea.top, bitmapDC, 0, 0, 1, 1, BLENDFUNCTION{ AC_SRC_OVER, 0, 50, AC_SRC_ALPHA }))
#else
        StretchBlt(dc, rArea.left, rArea.top, (rArea.right - rArea.left), rArea.bottom - rArea.top, bitmapDC, 0, 0, 1, 1, SRCCOPY_USEALPHACHAN);
#endif
        {
        ReleaseDC(hwnd, dc);
 
        return result;
        }
    }   
    return AreaSelectionWndProc(hwnd, uMsg, wParam, lParam);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2020, 16:59
Ответы с готовыми решениями:

Как послать сообщение окну с текстбоксом
Как послать сообщение окну с текстбоксом, что текстбокс изменён? Тут https://www.cyberforum.ru/wpf-silverlight/thread538217.html ...

Как конкретному окну послать сообщение?
Здравствуйте. Есть два приложения которые имеют одинаковое хендл и ID процес(к примеру запустить два калькулятора). Как мне передать...

Как послать окну сообщение через PostMessage если нет дочернего окна
Отправляю сообщения о нажатия клавиши через PostMessage(). Для отправки эта функция требует дочернее окно. К примеру в блокноте это окно с...

9
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22
27.02.2020, 17:32  [ТС]
Прошу прощения иллюстрация не приложилась
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
27.02.2020, 17:58
Попробуйте SendMessage заменить на PostMessage.
Разница в том, что SendMessage задерживает дальнейшее выполнение кода, до тех пор, пока не будет обработано.
1
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22
27.02.2020, 18:22  [ТС]
Спасибо Сергей Сергеевич!
Попробовал заменить но почему то такой же эффект как и от SendMessage. Появилось красное поле значит щелчок прошел в окно Рипер.Дальше с 46 строчка отрабатывает то есть сообщение m("key"); появляется в консоли, но скрипт не отрабатывает как надо прорисовку голубого(блеклого ректа). Только после отпускания кнопки мыши код с 44 до 96 строчки начинает делать как надо(рисует рект за мышой).И далее залипает на этом месте не принимая WM_LBUTTONUP.Вот так:
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.02.2020, 18:49
Цитата Сообщение от nappiea Посмотреть сообщение
Но мне нужно что бы одновременно с нажатием левой кнопки нажималась правая.
А зачем тебе здесь вообще нужно нажимать правую кнопку?
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22
27.02.2020, 18:57  [ТС]
Нужно сделать что бы "мой" код и штатное выделение времени Рипера синхронно отрабатывали и соответственно легче всего повесить его на правую кнопку. Там очень много причин почему так решил сделать.Например в панели таймкода показывает такты начала выделения и конца при выделении. А вот с этими кликами застрял на 3 дня((
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.02.2020, 20:51
Цитата Сообщение от nappiea Посмотреть сообщение
. А вот с этими кликами застрял на 3 дня((
Подозреваю, потому что ты как-то не так это делаешь.
Я просто не могу понять, зачем посылать WM_RBUTTONDOWN самому себе.
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22
27.02.2020, 21:42  [ТС]
oleg-m1973,Да до этого все было гладко.Вот и прошу помощи у комьюнити.

Это просто жесткие костыли, окно получается сторонней программы Reaper(Я его процессы контролировать не могу), а мое приложение устанавливает хук поверх окна и добавляет недостающую функцию.Но работать они должны одновременно.И на правую кнопку мыши в опциях Рипер установлено выделение времени.
Прошу прощения что очень сумбурно объясняю только что влез в плюсы winapi и систему сообщений.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.02.2020, 22:12
Цитата Сообщение от nappiea Посмотреть сообщение
Прошу прощения что очень сумбурно объясняю только что влез в плюсы winapi и систему сообщений.
Недостаточно просто взять и послать любое сообщение с любыми параметрами. У сообщений от мыши есть ещё wParam, который не всегда равен нулю. И если посылаешь WM_RBUTTONDOWN, то надо потом, наверное, посылать WM_RBUTTONUP. И т.д. и т.п.
А ещё лучше посмотреть при помощи Spy++, какие сообщения приходят.
1
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 22
28.02.2020, 19:25  [ТС]
oleg-m1973, Спасибо! Совсем забыл про Spy++ короче посмотрел, что он там творит и заменил WM_LBUTTONDOWN на (GetAsyncKeyState(VK_LBUTTON) >> 1) Заработало как надо!
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2020, 19:25
Помогаю со студенческими работами здесь

Послать окну сообщение HWND_TOPMOST
Здравствуйте!!! Ребята, помогите, дописать код. Вот код: void __fastcall TOptions::myWndProc(Messages::TMessage &amp;Message) { if...

Послать сообщение окну в указанный момент времени
Здравия желаю! Вот сижу, в носу ковыряюсь от скуки — задел извилину. Интересно стало: как можно без цикла проверки системного...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru