С Новым годом! Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107

Блокировка мыши по оси y

18.03.2015, 18:11. Показов 2677. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех!
Помогите пожалуйста, уже спрашивал и по c++ искал, и по python не нашел, может поможете на каком бейсике сделать? Подскажите библиотеки и т.д?
Есть задача, при нажатии ctrl(control)+1 остановить движение мышьки по координате y, оставив на текущей, то есть чтоб нельзя было двигать вверх вниз, но позиция была та, что когда я нажимал на горячие клавиши, и работало это в любом окне, а влево и вправо слободно ходило.
А ctrl + 2 чтоб программа прекращала работу.
Представляю себе это так:
dim y as integer
dim yposition as integer
С помощью какой-то библиотеки вычислить текущую координату y
if key_pressed(код_клавиши_контрол) and key_pressed(код_клавиши_1) then и пускаем функцию
if y <> yposition then y = yposition
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.03.2015, 18:11
Ответы с готовыми решениями:

Блокировка мыши по оси y
Здравствуйте! Нужно решить задачу: Вычислять текущую позицию по оси y, и при нажатии ctrl(control)+1 блокировать мышь по этой оси, т.е...

Блокировка клавиатуры и мыши
Нашел код блокировки клавиатуры и мыши, но почему то ничего не происходит. У когонибудь есть рабочий код? Тестил так ...

Блокировка движения мыши
Вопрос такого рода , как заблокировать передвижение или вообще откл. мышь при выполнении программы ?

19
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
18.03.2015, 21:55
  1. Регистрируешь "горячие" клавиши (Ctrl+1, Ctrl+2);
  2. Ставишь хук на мышь;
  3. В хуке запрещаешь дальнейшую обработку сообщений и изменяешь координаты как хочешь;
  4. В обработчике WM_HOTKEY выполняешь обработку "горячих" клавиш.

Я написал тебе полностью готовый пример (без обработки ошибок - сам сделаешь) на Visual Basic 6. Нажатие Ctrl+1 работает как переключатель - включить/выключить ограничение на движение по оси Y. Нажатие Ctrl+2 - выход.
Visual Basic
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
Option Explicit
 
Private Type POINTAPI
    x           As Long
    y           As Long
End Type
 
Private Type MSG
    hwnd        As Long
    message     As Long
    wParam      As Long
    lParam      As Long
    time        As Long
    pt          As POINTAPI
End Type
 
Private Type MSLLHOOKSTRUCT
    pt          As POINTAPI
    mouseData   As Long
    flags       As Long
    time        As Long
    dwExtraInfo As Long
End Type
 
Private Declare Function GetMessage Lib "user32" Alias "GetMessageW" (lpMsg As Any, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Private Declare Function TranslateMessage Lib "user32" (lpMsg As Any) As Long
Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageW" (lpMsg As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExW" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Integer, lParam As Any) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
 
Private Const WH_MOUSE_LL       As Long = &HE&
Private Const HC_ACTION         As Long = 0
Private Const WM_MOUSEMOVE      As Long = &H200
Private Const MOD_CONTROL       As Long = &H2
Private Const WM_HOTKEY         As Long = &H312
 
Dim hHookMouse  As Long
Dim flag        As Boolean  ' Флаг, отвечающий за ограничение движения по оси Y
Dim lastFixPos  As POINTAPI
 
' // Стартовая процедура
Public Sub Main()
    Dim curMsg  As MSG
    Dim ret     As Long
    
    ' Без обработки ошибок, сделаешь сам
    ' Установка хука на мышь
    hHookMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
 
    ' Регистрация горячих клавиш
    RegisterHotKey 0, 1, MOD_CONTROL, vbKey1
    RegisterHotKey 0, 2, MOD_CONTROL, vbKey2
    
    ' Цикл обработки сообщений потока
    Do
        
        ret = GetMessage(curMsg, 0, 0, 0)
        
        If ret = -1 Then
        
            MsgBox "Error msg loop"
            Exit Do
            
        ElseIf ret Then
                       
            TranslateMessage curMsg
            DispatchMessage curMsg
            
            ' Обработка "горячих" клавиш
            If curMsg.message = WM_HOTKEY Then
                
                Select Case curMsg.wParam
                ' Ctrl+1
                Case 1
                
                    flag = Not flag
                    ' Получаем позицию курсора на момент сообщения
                    If flag Then lastFixPos = curMsg.pt
                    
                ' Ctrl+2
                Case 2
                    Exit Do
                End Select
 
            End If
            
        End If
        
    Loop While ret
    
    ' Отмена регистраций
    UnregisterHotKey 0, 1
    UnregisterHotKey 0, 2
    ' Снятие хука
    UnhookWindowsHookEx hHookMouse
    
End Sub
 
' // Процедура обработки событий мыши
Private Function LowLevelMouseProc(ByVal uCode As Long, ByVal wParam As Long, lParam As MSLLHOOKSTRUCT) As Long
    
    If uCode = HC_ACTION And wParam = WM_MOUSEMOVE And flag Then
        
        ' Устанавливаем позицию, оставляя координату Y на момент нажатия "горячей" клавиши
        SetCursorPos lParam.pt.x, lastFixPos.y
        ' Выходим без дальнейшей обработки
        LowLevelMouseProc = -1
        Exit Function
                
    End If
    
    LowLevelMouseProc = CallNextHookEx(hHookMouse, uCode, wParam, lParam)
    
End Function
Начни изучать хоть какой-нибудь язык.
Вложения
Тип файла: rar ClipCursor.rar (9.1 Кб, 11 просмотров)
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
18.03.2015, 22:00  [ТС]
исключительно на 6 vb? он под семерку вроде не пашет
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
18.03.2015, 22:05
Цитата Сообщение от jonikster Посмотреть сообщение
исключительно на 6 vb?
Что исключительно?
Цитата Сообщение от jonikster Посмотреть сообщение
он под семерку вроде не пашет
Кто такую ересь сказал? Почему он не должен "пахать"?
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
18.03.2015, 22:07  [ТС]
Код исключительно под vb6? vb6 не имеет .net, по этому лучш использовать на старых системах. Или я не прав?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
18.03.2015, 22:10
Цитата Сообщение от jonikster Посмотреть сообщение
Код исключительно под vb6?
Возможно и под VB5, я не могу проверить никогда им не пользовался.
Цитата Сообщение от jonikster Посмотреть сообщение
vb6 не имеет .net
Если ты имел в виду фреймворк, то он имеет рантайм, но рантайм присутствует на всех системах по умолчанию.
Цитата Сообщение от jonikster Посмотреть сообщение
по этому лучш использовать на старых системах. Или я не прав?
Не прав.
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
18.03.2015, 22:18  [ТС]
в таком случии не подскажешь, где лучше скачать vb6? С vb 6 никогда дела не имел, тока .net слегка

Добавлено через 7 минут
кстати, а vb6 будет работать на 64 бит?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
18.03.2015, 22:29
Цитата Сообщение от jonikster Посмотреть сообщение
С vb 6 никогда дела не имел, тока .net слегка
На дотнете тоже самое можно сделать, не зря я тебе алгоритм расписал.
Цитата Сообщение от jonikster Посмотреть сообщение
кстати, а vb6 будет работать на 64 бит?
Будет работать на 64 разрядной Windows как и любые другие 32-разрядные приложения.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,370
Записей в блоге: 7
18.03.2015, 22:32
По моему код можно значительно упростить.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rect.RECT
 
Repeat
  If GetAsyncKeyState_(#VK_CONTROL)
    If GetAsyncKeyState_(#VK_1)
      GetCursorPos_(@Pos.POINT)
      SetRect_(@rect, 0, Pos\y, GetSystemMetrics_(#SM_CXSCREEN), Pos\y)
      ClipCursor_(@rect)
    ElseIf GetAsyncKeyState_(#VK_2)
      ClipCursor_(0)
      Break
    EndIf
  EndIf
  
  Delay(100)
ForEver
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
18.03.2015, 22:40  [ТС]
О! Мой любимый пурик, если б он был не огроменным в коде, я б послал все языки и учил б тока его

Добавлено через 3 минуты
это кста 4 пурик или 5? а то на 5 такого я еще не видел
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
18.03.2015, 23:02
Цитата Сообщение от locm Посмотреть сообщение
По моему код можно значительно упростить.
Я не люблю загружать процессор просто так, когда есть методы позволяющие делать это с минимальными затратами. Для чего мне гонять бесконечный цикл и замораживать поток, когда я могу делать полезные вещи в этот момент? Не думаю что ТС хотел ограничится только этим, а захочет что-то еще. К тому же в перерывах между вызовами я могу перемещать курсор за пределы, а это неправильно; уменьшая задержку - я увеличиваю нагрузку на процессор. Также другие приложения могут использовать ClipCursor.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,370
Записей в блоге: 7
19.03.2015, 09:52
Цитата Сообщение от jonikster Посмотреть сообщение
если б он был не огроменным в коде
Все зависит от задачи и как ее реализовать. При правильном подходе, кода бывает не много.

Цитата Сообщение от The trick Посмотреть сообщение
Я не люблю загружать процессор просто так, когда есть методы позволяющие делать это с минимальными затратами.
Код сильно не нагружает процессор. Это-же проверка нажатий кнопок пару раз в секунду. Уверен что хук будет тратить меньше процессорного времени? Это-же при любом случае вызывается функция LowLevelMouseProc() и ее код может больше "съесть" ресурсов чем простой цикл.

Цитата Сообщение от The trick Посмотреть сообщение
когда я могу делать полезные вещи в этот момент?
Тогда цикл в отдельный поток и нет проблемы.

Цитата Сообщение от The trick Посмотреть сообщение
К тому же в перерывах между вызовами я могу перемещать курсор за пределы
С этого места по подробнее. Точно знаешь как работает WinAPI функция ClipCursor()?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
20.03.2015, 06:52
Цитата Сообщение от locm Посмотреть сообщение
Уверен что хук будет тратить меньше процессорного времени? Это-же при любом случае вызывается функция LowLevelMouseProc() и ее код может больше "съесть" ресурсов чем простой цикл.
Уверен. Функция будет вызываться когда нужно, т.е. когда я работаю с мышью. В других случаях (печатаю я на клавиатуре, смотрю фильм, хожу в магазин) - не будет. У тебя же цикл крутится постоянно.
Цитата Сообщение от locm Посмотреть сообщение
Тогда цикл в отдельный поток и нет проблемы.
Зачем создавать поток и тратить ресурсы там где это не требуется?
Цитата Сообщение от locm Посмотреть сообщение
С этого места по подробнее. Точно знаешь как работает WinAPI функция ClipCursor()?
Знаю. Попробуй переключать активное приложение и двигать мышью.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,370
Записей в блоге: 7
20.03.2015, 11:14
Цитата Сообщение от The trick Посмотреть сообщение
Функция будет вызываться когда нужно, т.е. когда я работаю с мышью
Т. е. почти всегда.

Цитата Сообщение от The trick Посмотреть сообщение
Зачем создавать поток и тратить ресурсы там где это не требуется?
Зачем писать тонну кода, когда можно обойтись парой строк и получить тот же результат? А поток в данном случае создавать вовсе не нужно, т. к. программа кроме этой задачи больше ничего не делает.

Цитата Сообщение от The trick Посмотреть сообщение
Попробуй переключать активное приложение и двигать мышью.
Все нормально работает. Курсор мышки не выходит за заданные координаты.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
20.03.2015, 18:42
Цитата Сообщение от locm Посмотреть сообщение
Т. е. почти всегда.
Хм... Спорное утверждение, например у меня комп часто что-то считает (в частности рендерит) и я не пользуюсь в это время мышью. Твой код постоянно будет почти в каждой функции переходить в режим ядра и обратно.
Цитата Сообщение от locm Посмотреть сообщение
Зачем писать тонну кода, когда можно обойтись парой строк и получить тот же результат? А поток в данном случае создавать вовсе не нужно, т. к. программа кроме этой задачи больше ничего не делает.
Тонны кода я в своем примере не увидел, зато он выполняет честно только свою задачу и ничего более.
Цитата Сообщение от locm Посмотреть сообщение
Все нормально работает. Курсор мышки не выходит за заданные координаты.
Выходит, почитай MSDN, там внизу есть эта проблема и описание решения через LL-хуки.
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
21.03.2015, 03:33  [ТС]
По поводу тонн кода, на мой взгляд кода дествительно оч много. А по поводу обработок ошибок что это? не встречал никогда нив каких языках.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
21.03.2015, 06:09
Цитата Сообщение от jonikster Посмотреть сообщение
А по поводу обработок ошибок что это? не встречал никогда ни в каких языках.
В VB6 это On Error GoTo
В VB.NET, как и во многих других, применяется такая конструкция:
VB.NET
1
2
3
4
5
Try
   ...
  Catch 
   ...
  End Try
0
55 / 13 / 2
Регистрация: 26.10.2014
Сообщений: 1,107
21.03.2015, 11:05  [ТС]
ну код этот на vb6, так что нужно поять под него это. а что это вообще делает? что без него никак не обойтись?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
21.03.2015, 15:20
Цитата Сообщение от jonikster Посмотреть сообщение
а что это вообще делает?
тут можно прочитать
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
22.03.2015, 09:33
Цитата Сообщение от jonikster Посмотреть сообщение
на мой взгляд кода дествительно оч много.
Кода не много, убери декларации и комментарии и увидишь сколько кода осталось. А если для тебя это "тонны" кода, то не знаю как ты собрался писать игру.
Цитата Сообщение от jonikster Посмотреть сообщение
А по поводу обработок ошибок что это?
В данном случае речь шла о проверке возвращаемых значений и при необходимости анализирования Err.LastDllError.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2015, 09:33
Помогаю со студенческими работами здесь

Блокировка клавиатуры и мыши
Доброго всем времени суток! Задача в следующем: Имеется программа, по истечении некоторого времени нужно полностью заблокировать...

Блокировка клавиатуры и мыши
В общем, завел я себе котенка, и появилась актуальная для меня тема... уж очень любит кашара по клаве скакать... и вот что я хочу: 1)...

Блокировка клавиатуры и мыши
у нас в организации настроен телемост между двумя городами. на удаленном компьютере кто-то повадился включать музыку, что отвлекает...

Блокировка экрана, мыши и клавиатуры
Доброго времени суток! можно ли как-то на С# реализовать экрана, мыши и клавиатуры на уровня биос?

Блокировка двойного клика на мыши
Добрый день. Есть проблема) Сломалась мышь. Вместо одного клика по левой кнопке происходит двойной клик. Есть мысль попробовать написать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru