Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
1

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

27.02.2020, 16:59. Показов 456. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2020, 16:59
Ответы с готовыми решениями:

Как послать сообщение окну с текстбоксом
Как послать сообщение окну с текстбоксом, что текстбокс изменён? Тут...

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

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

Послать окну сообщение HWND_TOPMOST
Здравствуйте!!! Ребята, помогите, дописать код. Вот код: void __fastcall...

9
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
27.02.2020, 17:32  [ТС] 2
Прошу прощения иллюстрация не приложилась
0
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
Модератор
Эксперт С++
10696 / 8866 / 5354
Регистрация: 18.12.2011
Сообщений: 23,731
27.02.2020, 17:58 3
Попробуйте SendMessage заменить на PostMessage.
Разница в том, что SendMessage задерживает дальнейшее выполнение кода, до тех пор, пока не будет обработано.
1
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
27.02.2020, 18:22  [ТС] 4
Спасибо Сергей Сергеевич!
Попробовал заменить но почему то такой же эффект как и от SendMessage. Появилось красное поле значит щелчок прошел в окно Рипер.Дальше с 46 строчка отрабатывает то есть сообщение m("key"); появляется в консоли, но скрипт не отрабатывает как надо прорисовку голубого(блеклого ректа). Только после отпускания кнопки мыши код с 44 до 96 строчки начинает делать как надо(рисует рект за мышой).И далее залипает на этом месте не принимая WM_LBUTTONUP.Вот так:
0
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
6715 / 4522 / 1831
Регистрация: 07.05.2019
Сообщений: 13,696
Записей в блоге: 1
27.02.2020, 18:49 5
Цитата Сообщение от nappiea Посмотреть сообщение
Но мне нужно что бы одновременно с нажатием левой кнопки нажималась правая.
А зачем тебе здесь вообще нужно нажимать правую кнопку?
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
27.02.2020, 18:57  [ТС] 6
Нужно сделать что бы "мой" код и штатное выделение времени Рипера синхронно отрабатывали и соответственно легче всего повесить его на правую кнопку. Там очень много причин почему так решил сделать.Например в панели таймкода показывает такты начала выделения и конца при выделении. А вот с этими кликами застрял на 3 дня((
0
6715 / 4522 / 1831
Регистрация: 07.05.2019
Сообщений: 13,696
Записей в блоге: 1
27.02.2020, 20:51 7
Цитата Сообщение от nappiea Посмотреть сообщение
. А вот с этими кликами застрял на 3 дня((
Подозреваю, потому что ты как-то не так это делаешь.
Я просто не могу понять, зачем посылать WM_RBUTTONDOWN самому себе.
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
27.02.2020, 21:42  [ТС] 8
oleg-m1973,Да до этого все было гладко.Вот и прошу помощи у комьюнити.

Это просто жесткие костыли, окно получается сторонней программы Reaper(Я его процессы контролировать не могу), а мое приложение устанавливает хук поверх окна и добавляет недостающую функцию.Но работать они должны одновременно.И на правую кнопку мыши в опциях Рипер установлено выделение времени.
Прошу прощения что очень сумбурно объясняю только что влез в плюсы winapi и систему сообщений.
0
6715 / 4522 / 1831
Регистрация: 07.05.2019
Сообщений: 13,696
Записей в блоге: 1
27.02.2020, 22:12 9
Цитата Сообщение от nappiea Посмотреть сообщение
Прошу прощения что очень сумбурно объясняю только что влез в плюсы winapi и систему сообщений.
Недостаточно просто взять и послать любое сообщение с любыми параметрами. У сообщений от мыши есть ещё wParam, который не всегда равен нулю. И если посылаешь WM_RBUTTONDOWN, то надо потом, наверное, посылать WM_RBUTTONUP. И т.д. и т.п.
А ещё лучше посмотреть при помощи Spy++, какие сообщения приходят.
1
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 12
28.02.2020, 19:25  [ТС] 10
oleg-m1973, Спасибо! Совсем забыл про Spy++ короче посмотрел, что он там творит и заменил WM_LBUTTONDOWN на (GetAsyncKeyState(VK_LBUTTON) >> 1) Заработало как надо!
0
Миниатюры
Как в этом коде послать сообщение о правом клике окну и ничего не сломать?  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2020, 19:25

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.