Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.02.2023
Сообщений: 5

Получить направление колёсика мышки, но без использования Windows Form и WPF

26.02.2023, 13:37. Показов 1014. Ответов 8

Студворк — интернет-сервис помощи студентам
Мне нужно получать информацию о том в какую сторону крутится мышка. Можно использовать WinAPI или любую другую библиотеку. Главное что бы это работало на консольном приложении.
Если это упростит задачу вот код на WinAPI, но он не работает. Много сайтов перерыл, но ничего более мене внятного нет. Буду благодарен за любую помощь.
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
private const int WM_MOUSEWHEEL = 0x020A;
 
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct MSG
        {
            public IntPtr Hwnd;
            public uint Message;
            public IntPtr WParam;
            public IntPtr LParam;
            public uint Time;
            public POINT Pt;
        }
 
        [DllImport("user32.dll")]
        public static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
 
        [DllImport("user32.dll")]
        public static extern bool TranslateMessage(ref MSG lpMsg);
 
        [DllImport("user32.dll")]
        public static extern IntPtr DispatchMessage(ref MSG lpMsg);
 
        public static void Mouse()
        {
            MSG msg;
 
            Console.WriteLine(GetMessage(out msg, IntPtr.Zero, 0, 0));
 
            while (GetMessage(out msg, IntPtr.Zero, 0, 0))
            {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
 
                if (msg.Message == WM_MOUSEWHEEL)
                {
                    short delta = (short)(((uint)msg.WParam >> 16) & 0xffff);
 
                    Console.WriteLine($"Mouse wheel delta: {delta}");
                }
            }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2023, 13:37
Ответы с готовыми решениями:

ReadConsoleInput не ловит события прокрутки колесика мышки на Windows 10
Есть код, который ловит input события консоли и выводит реакцию, если это события мыши (это просто немного упрощенная версия кода exampl'a...

WPF: как получить событие прокрутки колёсика мыши?
Есть 'ItemsControl', который отрисовывает коллекцию графических элементов. И есть потребность изменять масштаб отображаемой области через...

Титры (Движение текста без использования мышки)
Столкнулся С Такой Проблемой, Что Когда Нажимаешь На Кнопку (Сделал как ссылку) Должно Начинаться Движение Текста Вверх, Но Почему-то У...

8
 Аватар для Sunseodaero
27 / 18 / 9
Регистрация: 26.02.2023
Сообщений: 62
26.02.2023, 13:39
Вот код на C#
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
using System;
using System.Runtime.InteropServices;
 
class Program
{
    static void Main()
    {
        Console.WriteLine("Начните вращать колесо мыши...");
        while (true)
        {
            int scrollAmount = GetScrollAmount();
            if (scrollAmount != 0)
            {
                Console.WriteLine(scrollAmount > 0 ? "Колесо мыши крутится вверх." : "Колесо мыши крутится вниз.");
            }
        }
    }
 
    [DllImport("user32.dll")]
    static extern short GetKeyState(int nVirtKey);
 
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(int vKey);
 
    [DllImport("user32.dll")]
    static extern int GetMessageExtraInfo();
 
    static int GetScrollAmount()
    {
        const int WM_MOUSEWHEEL = 0x020A;
        const int WM_MOUSEHWHEEL = 0x020E;
        const int VK_LBUTTON = 0x01;
        const int VK_RBUTTON = 0x02;
        const int VK_MBUTTON = 0x04;
 
        int extraInfo = GetMessageExtraInfo();
        if ((extraInfo & 0x01000000) != 0)
        {
            if (GetAsyncKeyState(VK_LBUTTON) < 0 || GetAsyncKeyState(VK_RBUTTON) < 0 || GetAsyncKeyState(VK_MBUTTON) < 0)
            {
                int scrollAmount = (short)(extraInfo >> 16);
                return scrollAmount;
            }
        }
        else
        {
            int scrollAmount = (short)(extraInfo >> 16);
            return scrollAmount;
        }
 
        return 0;
    }
}
0
0 / 0 / 0
Регистрация: 26.02.2023
Сообщений: 5
26.02.2023, 14:02  [ТС]
Sunseodaero, Код который вы мне скинули, не работает. Ну то есть метод GetScrollAmount() возвращает 0, как бы я не крутил колёсика мышки
0
 Аватар для Sunseodaero
27 / 18 / 9
Регистрация: 26.02.2023
Сообщений: 62
26.02.2023, 14:05
Попробуйте это
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
using System;
using System.Runtime.InteropServices;
 
class Program
{
    static void Main()
    {
        Console.WriteLine("Начните вращать колесо мыши...");
        while (true)
        {
            int scrollAmount = GetScrollAmount();
            if (scrollAmount != 0)
            {
                Console.WriteLine(scrollAmount > 0 ? "Колесо мыши крутится вверх." : "Колесо мыши крутится вниз.");
            }
        }
    }
 
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(int vKey);
 
    [DllImport("user32.dll")]
    static extern int GetMessageExtraInfo();
 
    static int GetScrollAmount()
    {
        const int WM_MOUSEWHEEL = 0x020A;
        const int WM_MOUSEHWHEEL = 0x020E;
        const int MK_LBUTTON = 0x0001;
        const int MK_RBUTTON = 0x0002;
        const int MK_MBUTTON = 0x0010;
 
        int extraInfo = GetMessageExtraInfo();
        if ((extraInfo & 0x01000000) != 0)
        {
            if ((GetAsyncKeyState(MK_LBUTTON) < 0) || (GetAsyncKeyState(MK_RBUTTON) < 0) || (GetAsyncKeyState(MK_MBUTTON) < 0))
            {
                int scrollAmount = (short)(extraInfo >> 16);
                return scrollAmount;
            }
        }
        else
        {
            int scrollAmount = (short)(extraInfo >> 16);
            return scrollAmount;
        }
 
        return 0;
    }
}
0
0 / 0 / 0
Регистрация: 26.02.2023
Сообщений: 5
26.02.2023, 14:19  [ТС]
Sunseodaero, ничего особо не изменилось, метод GetScrollAmount() также возвращает 0. И ещё, а зачем в коде GetAsyncKeyState, он же реагирует на нажатия клавиш на мышке, а мне не нужно определять нажатия клавиш? Тоже когда начинал работу над кодом думал что будет очень легко, в итого несколько дней уже над этим мучаюсь.
0
 Аватар для Sunseodaero
27 / 18 / 9
Регистрация: 26.02.2023
Сообщений: 62
26.02.2023, 14:27
Тогда попробуйте это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[DllImport("user32.dll")]
static extern int GetMessageExtraInfo();
 
static int GetScrollAmount()
{
    const int WM_MOUSEWHEEL = 0x020A;
    const int WM_MOUSEHWHEEL = 0x020E;
 
    int extraInfo = GetMessageExtraInfo();
    int scrollAmount = (short)(extraInfo >> 16);
 
    if ((extraInfo & 0x01000000) != 0)
    {
        int message = extraInfo & 0x0000FFFF;
        if (message == WM_MOUSEWHEEL || message == WM_MOUSEHWHEEL)
        {
            return scrollAmount;
        }
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 26.02.2023
Сообщений: 5
26.02.2023, 14:42  [ТС]
Sunseodaero, не работает. Но всё равно спасибо за старание. Если знаете другую библиотеку с подобным функционалом, можно попробовать её.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
26.02.2023, 18:55
Лучший ответ Сообщение было отмечено gimasss как решение

Решение

Так вроде работает...
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
using System;
using System.Runtime.CompilerServices;
using static ConsoleApp7.Win32;
 
namespace ConsoleApp7 {
 
    internal class Program {
        static HookProc proc;
 
        static void Main(string[] args) {
            IntPtr module = GetModuleHandleA("user32.dll");
 
            proc = new HookProc(MouseHookProc);
 
            IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, module, 0);
 
            MSG msg;
 
            while (GetMessage(out msg, IntPtr.Zero, 0, 0)) {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
        }
 
        static unsafe IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {
            if (nCode < 0) {
                return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
            }
 
            ref MSLLHOOKSTRUCT mouseStruct = ref Unsafe.AsRef<MSLLHOOKSTRUCT>((void*)lParam);
 
            switch ((int)wParam) {
                case WM_MOUSEWHEEL:
                    int scrollAmount = mouseStruct.mouseData >> 16;
                    Console.WriteLine($"WM_MOUSEWHEEL from MouseHookProc {scrollAmount}");
                    break;
            }
 
            return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
        }
    }
}
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
using System;
using System.Runtime.InteropServices;
 
namespace ConsoleApp7 {
    internal static class Win32 {
        public const int WM_MOUSEWHEEL = 0x020A;
        public const int WH_MOUSE_LL = 14;
 
        public delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);
 
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT {
            public int X;
            public int Y;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct MSLLHOOKSTRUCT {
            public POINT pt;
            public int mouseData;
            public int flags;
            public int time;
            public UIntPtr dwExtraInfo;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct MSG {
            public IntPtr Hwnd;
            public uint Message;
            public IntPtr WParam;
            public IntPtr LParam;
            public uint Time;
            public POINT Pt;
        }
 
        [DllImport("user32.dll")]
        public static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
 
        [DllImport("user32.dll")]
        public static extern bool TranslateMessage(ref MSG lpMsg);
 
        [DllImport("user32.dll")]
        public static extern IntPtr DispatchMessage(ref MSG lpMsg);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr GetModuleHandleA(string module);
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SetWindowsHookEx(int hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);
 
        [DllImport("user32.dll")]
        public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    }
}
1
0 / 0 / 0
Регистрация: 26.02.2023
Сообщений: 5
26.02.2023, 20:31  [ТС]
Someone007, Благодарю, ты мне очень сильно помог, я уже очень долго с этим возился.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2023, 20:31
Помогаю со студенческими работами здесь

Прокрутка колёсика мышки
Наверняка уже обсуждалось, но в поиске не нашёл... Требуется отслеживать изменение положения колёсика и далее надо будет применять те...

Как проверить направление вращения колесика мыши?
Здравствуйте, уважаемые программисты! недавно начал изучать программирование вообще и на С# в частности. Созрел такой вопрос - как...

Не работает блокировка колесика мышки
Нужно при скролле проверить, зажат ли левый контролл и, если зажат, сделать определенные действия и НЕ скроллить. Пытаюсь сделать так: ...

Блокировка прокрутки колесика мышки
Привет, подскажите как в jQuery осуществляется Блокировка прокрутки колесика мышки до окончания выполнения скрипт. Есть слайдер с...

Из WPF открыть Windows Form
собственно помогите пжлста из WPF хотел в Windows Form переписать. вот сам проект. возможно ли WarkeyPage(внутри) переписать и открыть...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru