Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294

Как отобразить в sendmessage координаты курсора

28.08.2017, 19:17. Показов 3597. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, подскажите пожалуйста как отобразить в sendmessage координаты курсора(рабочей области окна) и на каком пункте меню находится курсор в данный момент. Спасибо!

Добавлено через 21 час 49 минут
Пробовал так, но не работает...
C++
1
SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)&(pt.x, pt.y));
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2017, 19:17
Ответы с готовыми решениями:

Как узнать координаты курсора мыши и отобразить их? c++
Как узнать координаты курсора мыши и отобразить их? c++

Как настроить отправку сообщений sendMessage(sendMessage)?
Доброго времени суток! Подскажите пожалуйста как решить проблему: хочу создать простого телеграм бота, чтобы поучиться java. Решил...

Как получить координаты курсора?
Добрый день. При Клике мышкой на кнопку, не могу получить координаты указателя, а при клике на пустое поле формы, координаты задаются...

23
Native x86
Эксперт Hardware
 Аватар для quwy
6856 / 3789 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
28.08.2017, 19:20
Цитата Сообщение от Kurtis Посмотреть сообщение
как отобразить в sendmessage
Отобразить? Вы точно понимаете, что делает SendMessage?

Добавлено через 1 минуту
P.S. Может быть вам нужен MessageBox?
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 20:18  [ТС]
quwy, SendMessage отправляет данные, конкретно в моем примере, в строку состояния.

Добавлено через 1 минуту
quwy, Нет, у меня есть StatusBar, в котором необходимо отобразить координаты курсора. Как я понял это можно сделать SendMessage или PostMessage.

Добавлено через 1 минуту
quwy, пример кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int pParts[2];
        HWND hwndSb;
        UINT wID = 4000;
        POINT pt;
        GetCursorPos(&pt);
        ScreenToClient(hWnd, &pt);
        hwndSb = CreateStatusWindow(
            WS_CHILD |WS_VISIBLE | SBARS_SIZEGRIP,
            szProgName,
            hWnd,
            wID);
        pParts[0] = 100; //часть 1 
        pParts[1] = 100 + 100 ; // часть 2
        SendMessage(hwndSb, SB_SETPARTS, 2, (LPARAM)&pParts);
        TCHAR B1[] = "Блок 1";
        SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)&B1);
        SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)&(pt.x, pt.y));
        UpdateWindow(hwndSb);
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 20:20
Kurtis, Координаты курсора через SendMessage не получите. Можно их получить, если подписаться на сообщение винды WM_MOUSEMOVE, и получить соответствующие координаты из параметра с типом LPARAM. Вот к примеру мой обработчик, который подписан на WM_MOUSEMOVE:
C++
1
2
3
4
5
6
LRESULT BTSInput :: _onMouseMove( LPARAM lParam, WPARAM wParam )
{
    _currentMousePosition.x     =   GET_X_LPARAM( lParam );
    _currentMousePosition.y     =   GET_Y_LPARAM( lParam );
    return 0;
}
Но по видимому для Вас будет сложно написать систему сообщений, поэтому простой выход из ситуации, это в оконной процедуре проверять сообщение, которое пришло, если оно WM_MOUSEMOVE, то делаем, как в коде выше:
C++
1
2
3
4
5
6
7
8
9
10
11
LRESULT CALLBACK BTSWindow :: _wndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
    int x, y;
    if( message == WM_MOUSEMOVE )
    {
        x = GET_X_LPARAM( lParam );
        y = GET_Y_LPARAM( lParam );
    }
 
    return DefWindowProc( hwnd, message, wparam, lparam);
}
Да, и еще, чтобы использовать макросы GET_X_LPARAM/GET_Y_PARAM нужно подключить #include "windowsx.h"

Добавлено через 57 секунд
Ах да, забыл...после получения координат в x,y, выводите их где хотите, хоть в MessageBox, хоть где еще
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 20:28  [ТС]
Bretbas, как получить координаты курсора мыши я знаю, как их отправить в строку состояния?

Добавлено через 6 минут
Bretbas, quwy, в первом сообщение некорректно задан вопрос, за это прошу прощения. Необходимо через sendmessage или postmessage передать координаты курсора в StatusBar(строка состояния).
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 20:32
Kurtis, или я чего-то не догоняю, но почему у тебя в этой строке кода:
C++
1
SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)&(pt.x, pt.y));
написано вот так: (LPARAM)&(pt.x, pt.y) Что это вообще?
Если ты хочешь в одну часть StatusBar'а поместить отображение координат мыши, то нужно вообще понять в каком виде они будут представляться; я так понял ты хочешь что-то вроде такого "102, 434". Тогда нужно прежде чем сувать их в StatusBar, привести в такой вид. Тоесть в строку, и только потом передавать в StatusBar
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 20:38  [ТС]
Bretbas, структура такова:
C++
1
2
3
4
5
6
SendMessage(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
Добавлено через 1 минуту
Другого способа я пока не нашёл.. Поэтому и ищу ответ здесь
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 20:45
Kurtis, Ты не понял меня. Допустим мы получили координаты мыши в двух переменных X и Y. Теперь нужно создать строку, которая будет иметь вид типа " значение X, значени Y ". После этого, передать эту строку как один объект в последний параметр функции SendMessage. Понял?

C++
1
SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)&(pt.x, pt.y));
Здесь ты пытаешься непонятную хрень передать в последнем параметре. Нужен один параметр, понимаешь? Но так как ты хочешь, чтобы отображался и X и Y, то целесообразно сделать строку из этих X и Y
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 20:57  [ТС]
Bretbas, понял, пока не могу представить как это сделать
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 21:03
Kurtis, Попробуйте так:
C++
1
2
3
4
5
6
7
8
#include <string>
...
...
std :: string str = "(" + std :: to_string( pt.x ) + std :: to_string( pt.y ) + ")";
char* coordStr = str.c_str();
SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)&coordStr);
...
...
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 21:24  [ТС]
Bretbas, попробовал, значения есть, но как-то странно они отображаются.
Изображения
 
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 21:31
Лучший ответ Сообщение было отмечено Kurtis как решение

Решение

Kurtis, попробуй не адрес передавать, вот так: SendMessage(hwndSb, SB_SETTEXT, 1, (LPARAM)coordStr);
Может быть там Unicode нужен. Я не могу точно сказать. Так как это уже дело экспериментов, так как я никогда не использовал StatusBar

Главное, вы поняли, что нужно передавать строку, которая перед передачей приведена в вид "( x, y )". Если Вы поняли, то Вам не составит труда разобраться.

Мне нужно бежать...
1
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
28.08.2017, 21:35  [ТС]
Bretbas, спасибо!!!!
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.08.2017, 21:41
Kurtis, Напишите обязательно, получилось у Вас или нет. Если до завтра ничего не получится, то завтра и решим эту проблему
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
29.08.2017, 18:42
Цитата Сообщение от Kurtis Посмотреть сообщение
C++
1
2
3
4
5
6
SendMessage(
 _In_ HWND hwnd,
 _In_ UINT uMsg,
 _In_ WPARAM wParam,
 _In_ LPARAM lParam
);
Другого способа я пока не нашёл.. Поэтому и ищу ответ здесь
Kurtis, что означают параметры wParam, lParam, зависит от сообщения. В случае SB_SETTEXT message
lParam
Pointer to a null-terminated string that specifies the text to set.
Причем строка может быть char[] или wchar_t[] (см. в свойствах проекта, используется Юникод или нет).

Добавлено через 22 минуты
Пример. При нажатии левой кнопки мыши добавим текст в статусную строку.
C++
1
2
3
4
5
6
7
8
9
    case WM_LBUTTONUP:
        {
            TCHAR str[] = TEXT("hello");  // #include <tchar.h>
            //char str[] = "hello";
            //wchar_t str[] = L"hello";
            if (hwndStatusBar) 
                SendMessage(hwndStatusBar, SB_SETTEXT, 0, (LPARAM)str);
        }
        break;
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
29.08.2017, 19:24  [ТС]
Bretbas, добрый вечер, дошел до stackoverflow. Написали тоже самое что и Вы, дело в том, что координаты отображаются, когда я их указываю в wm_create - где я создаю строку состояния, как только я выношу в отдельный case WM_MOUSEMOVE, ничего не работает.
Alex5, попробовал применить Ваш пример, без результатов. Такое ощущение что чего-то не хватает...
Код создания строки (WM_CREATE):
C++
1
2
3
4
5
6
7
8
9
10
11
12
        int pParts[2];
        UINT wID = 4000;
        hwndSb = CreateStatusWindow(
            WS_CHILD |WS_VISIBLE | SBARS_SIZEGRIP,
            szProgName,
            hWnd,
            wID);
        pParts[0] = 100; //часть 1 
        pParts[1] = 100 + 100 ; // часть 2
        SendMessage(hwndSb, SB_SETPARTS, 2, (LPARAM)&pParts);
        TCHAR B1[] = "Блок 1";
        SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)&B1);
Отправка координат курсора(WM_MOUSEMOVE):
C++
1
2
3
4
5
6
7
            int x = (short)LOWORD(lParam);
            int y = (short)HIWORD(lParam);
            if (hwndSb)
            {
                std::string text = std::to_string(x) + ":" + std::to_string(y);
                SendMessage(hwndSb, SB_SETTEXTA, 1, (LPARAM)text.c_str());
            }
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
29.08.2017, 20:36
Kurtis,
Цитата Сообщение от Kurtis Посмотреть сообщение
дело в том, что координаты отображаются, когда я их указываю в wm_create - где я создаю строку состояния
Ты хочешь сказать, что у тебя в WM_CREATE вот этот код:
C++
1
2
3
4
...
std::string text = std::to_string(x) + ":" + std::to_string(y);
SendMessage(hwndSb, SB_SETTEXTA, 1, (LPARAM)text.c_str());
...
отображает координаты?
А когда выносишь в WM_MOUSEMOVE, то нет?
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
29.08.2017, 20:39
Цитата Сообщение от Kurtis Посмотреть сообщение
Такое ощущение что чего-то не хватает...
Kurtis, как определена переменная hwndSb? Это локальная переменная? Является ли она статической ?
C++
1
2
3
4
5
LONG WINAPI WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{ 
    // ... 
    static HWND  hwndSb = 0; 
    // ...
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
29.08.2017, 20:41  [ТС]
Bretbas, Добрый вечер, да, но эти координаты не обновляются.
Вот ссылка на проект
Проект

Добавлено через 45 секунд
Alex5, добрый вечер, локальная переменная, не является статической.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
29.08.2017, 20:42
Kurtis, по твоей ссылки нужно регаться на яндексе...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2017, 20:42
Помогаю со студенческими работами здесь

Как определить координаты курсора
Как в WPF определять координаты мыши ? В Windows Forms делала так: private void Form_1_MouseMove(object sender, MouseEventArgs...

Как узнать координаты курсора
Делал точно такую же програмку все работало, решил нарисавать формочку через Blend 4!И не работает помогите!Заранее благодарен! public...

Как задать координаты курсора?
Здравствуйте, Как задать координаты курсора?

Как узнать координаты курсора на экране???
Как узнать координаты курсора на экране?

Как узнать координаты курсора мыши
Как узнать положение курсора мыши на страницу?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю 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. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru