Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429

SetCursorPos работает только при нажатой ЛКМ

07.09.2023, 06:42. Показов 631. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для изменения позиции курсора мыши над picturebox использую:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub picCanvas_KeyDown(KeyCode As Integer, Shift As Integer)
    ret = GetCursorPos(absXY)
    absX = absXY.X '
    absY = absXY.Y '
    If KeyCode = vbKeyLeft Then
        absX = absX - 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyRight Then
        absX = absX + 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyUp Then
        absY = absY - 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyDown Then
        absY = absY + 1
        Call SetCursorPos(absX, absY)
    End If
End Sub
но изменение позиции мыши работает только при нажатой ЛКМ
Как сделать так чтобы работало и тогда, когда клавиши мыши не нажаты?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2023, 06:42
Ответы с готовыми решениями:

Считывание нажатой ПКМ при зажатой ЛКМ
Есть прямоугольник sf::RectangleShape, при зажатии ЛКМ по нему, он перемещается по окну за курсором и надо его вращать на 90 градусов по...

Рисование кривой линии при нажатой ЛКМ
Сабж. Нужно отрисовывать кривую линию при нажатой ЛКМ. Видеорежим: 320х200 (13h). Беру координаты курсора с помощью функции 3h...

Как вызывать событие скролла мыши только при нажатой клавише Shift
Собственно. private void Window_MouseWheel(object sender, MouseWheelEventArgs e) { scrollBar1.Value += (e.Delta...

6
sleep
 Аватар для I can
4934 / 4607 / 841
Регистрация: 13.04.2015
Сообщений: 9,774
07.09.2023, 07:39
Цитата Сообщение от giaber Посмотреть сообщение
но изменение позиции мыши работает только при нажатой ЛКМ
Нет, не должно быть такого.

Цитата Сообщение от giaber Посмотреть сообщение
GetCursorPos(absXY)
Можно взглянуть на код типа absXY ?
0
 Аватар для Mikle Quits
772 / 289 / 17
Регистрация: 21.01.2023
Сообщений: 472
07.09.2023, 08:30
Создал проект с таким кодом:
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
Option Explicit
 
Private Type POINTAPI
  x As Long
  y As Long
End Type
 
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
 
Private Sub picCanvas_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim absXY As POINTAPI
    Dim absX As Long
    Dim absY As Long
    Dim Ret As Long
 
    Ret = GetCursorPos(absXY)
    absX = absXY.x '
    absY = absXY.y '
    If KeyCode = vbKeyLeft Then
        absX = absX - 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyRight Then
        absX = absX + 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyUp Then
        absY = absY - 1
        Call SetCursorPos(absX, absY)
    ElseIf KeyCode = vbKeyDown Then
        absY = absY + 1
        Call SetCursorPos(absX, absY)
    End If
End Sub
Курсор управляется стрелками, но, если поместить на форму ещё контролы, нужно следить за фокусом, либо делать у формы KeyPreview = True и переносить код в обработчик в Form_KeyDown().
3
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
07.09.2023, 09:03  [ТС]
1)
для I can:
Visual Basic
1
2
3
4
5
6
7
8
9
'==================== Получить/установить позицию курсора =====================
Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public absXY As POINTAPI
Public Type POINTAPI
    X As Long
    Y As Long
End Type
'
Добавлено через 26 минут
2)
Если мой код и объявления в модуле сделать в новом проекте в котором кроме формы и picCanvas ничего больше нет то все работает нормально

3)
Mikle Quits - мне не совсем понятно ведь мне надо чтобы это работало тогда когда курсор над picCanvas а если поместить код в Form_KeyDown() то как это будет работать? Что я не догоняю?

Сделал как вы писали (код Select Case KeyCode немножко изменен, но рабочий):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
KeyPreview = True
 
GetCursorPos absXY
 
    Select Case KeyCode
        Case 37: absXY.X = absXY.X - 1 'Left key
        Case 38: absXY.Y = absXY.Y - 1 'Up key
        Case 39: absXY.X = absXY.X + 1 'Right Key
        Case 40: absXY.Y = absXY.Y + 1 'Down key
    End Select
 
    SetCursorPos absXY.X, absXY.Y
End Sub
у курсора ноль реакции даже когда курсор над формой а не над рисунком

что я не так делаю?
1
 Аватар для Mikle Quits
772 / 289 / 17
Регистрация: 21.01.2023
Сообщений: 472
07.09.2023, 09:55
KeyPreview = True нужно выставить в свойствах формы или поместить в Form_Load().

Цитата Сообщение от giaber Посмотреть сообщение
мне надо чтобы это работало тогда когда курсор над picCanvas
Событию KeyDown всё равно где курсор, это вообще клавиатурное событие. Придётся в его обработчике проверять, над нужным ли местом находится курсор, соответственно действовать.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.09.2023, 16:27
А вот и решение:

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
Option Explicit
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
 
Private Type POINTAPI
  x As Long
  y As Long
End Type
 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim absXY As POINTAPI
    
    Dim absX As Long
    Dim absY As Long
    
    GetCursorPos absXY
    absX = absXY.x
    absY = absXY.y
    
    ' Обрабатывать горячие клавиши только лишь, в случае если, указатель мыши находится над PictureBox
    If WindowFromPoint(absXY.x, absXY.y) = picCanvas.hWnd Then
        If KeyCode = vbKeyLeft Then
            absX = absX - 1
            Call SetCursorPos(absX, absY)
        ElseIf KeyCode = vbKeyRight Then
            absX = absX + 1
            Call SetCursorPos(absX, absY)
        ElseIf KeyCode = vbKeyUp Then
            absY = absY - 1
            Call SetCursorPos(absX, absY)
        ElseIf KeyCode = vbKeyDown Then
            absY = absY + 1
            Call SetCursorPos(absX, absY)
        End If
    End If
End Sub
 
Private Sub Form_Load()
    Me.KeyPreview = True
End Sub
Цитата Сообщение от giaber Посмотреть сообщение
мне надо чтобы это работало тогда когда курсор над picCanvas
Для этого используем функция WindowFromPoint которая определяет под каким окном сейчас находится курсор мыши. PictureBox это окно.
Вложения
Тип файла: zip WindowFromPoint.zip (1.6 Кб, 2 просмотров)
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
08.09.2023, 07:21  [ТС]
HackerVlad
Такие странные дела: Пока не кликнешь на пустом месте формы ничего не происxодит. После клика фокус устанавливается на HScrollBar и этот скролбар изменяет значение с каждым нажатием клавиши и двигает картинку как и запрограммировано. Курсор неподвижен независимо от того над формой он или над пикчербоксом. В отдельном проекте работают все варианты кодов из этого топика

Добавлено через 55 минут
Фу-у-у-у-x! Заработало! Короче очередной раз приодится извиняться за то что побеспокоил уважаемыx людей на пустом месте!
Оказывается в папке с проектом одновременно с frmMain.frm и frmMain.frx каким-то чудесным образом присутствовали и какие-то '.frm и '.frx и X.frx Откуда они взялись ума не приложу! И что было в связке друг с другом еле разобрался. Короче убрал все лишнее, "причесал", и все заработало! Точнее, на данный момент работает последний вариант от HackerVlad, сейчас попробую работает ли мой изначальный вариант.

Всем БОЛЬШОЕ спасибо и мои извинения!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2023, 07:21
Помогаю со студенческими работами здесь

SetCursorPos не работает на ПК без Visual Studio
Добрый день! Заранее прошу прощения за дилетантство:) Написал программку, которая помимо всего прочего использует перемещение...

NotifyIcon - отдельно обработать только ЛКМ
Есть такая проблема: Я создал NotifyIcon с меню, а также прописал по нажатию на иконку открывать форму.Но даже если не нажимать на...

Не работает ЛКМ
Из-за чего может не работать кнопка мышки???

Автоклик ЛКМ пока зажат ЛКМ
Такая фигня: можно ли сделать нажатие ЛКМ до тех пор, пока ЛКМ зажат? Могу сделать такую штуку на XBUTTON2 / XBUTTON1, но не могу сделать...

НЕ работает лкм у мышка bloody
Установил программу для мышки bloody. Перестала работать лкм, вернее срабатывает один из десяти кликов. В программе вообще не...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru