Как запретить курсору покидать окно программы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Как запретить курсору покидать окно программы

Сообщение GreenT » 24.11.2003 (Пн) 20:28

Собственно топик.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 24.11.2003 (Пн) 20:46

Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private cPos As POINTAPI
Private fRect As RECT
Private InPos As POINTAPI

Private Sub Form_Load()
DoEvents
Me.Show
SetCursorPos (fRect.Right - fRect.Left) / 2, (fRect.Bottom - fRect.Top) / 2
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
End
End Sub

Private Sub Form_Resize()
GetWindowRect Me.hwnd, fRect
End Sub

Private Sub Timer1_Timer()
GetCursorPos cPos

If cPos.x < fRect.Left Or cPos.x > fRect.Right Or _
cPos.y < fRect.Top Or cPos.y > fRect.Bottom Then
SetCursorPos InPos.x, InPos.y
Else:
GetCursorPos InPos
End If
End Sub


Код в общем понятен?

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 24.11.2003 (Пн) 21:01

Код: Выделить всё
Option Explicit

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long

Private ScreenRect As RECT
Private WindowRect As RECT

Private ClipMode As Boolean

Private Sub Command1_Click()
    ClipMode = Not ClipMode
    If (ClipMode) Then
        Call GetWindowRect(Me.hWnd, WindowRect)
        Call ClipCursor(WindowRect)
    Else
        Call ClipCursor(ScreenRect)
    End If
End Sub

Private Sub Form_Load()
    Call GetClipCursor(ScreenRect)
End Sub

Private Sub Form_Terminate()
    Call ClipCursor(ScreenRect)
End Sub

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 24.11.2003 (Пн) 21:25

Плюс небольшая модификация.

Окно можно сменить комбинацией Alt+Tab, следовательно нужно следить за клавой, но мышка мечется только в окне. Единственный глюк: если таскать ею окно, то снова становится активным весь экран. Как побороть не знаю, ни каких событий при этом окно не ловит.
Код: Выделить всё
Private Sub Form_Paint()
    Call GetWindowRect(Me.hwnd, WindowRect)
    Call ClipCursor(WindowRect)
End Sub

Private Sub Form_Resize()
    If (Me.WindowState = vbNormal) Then
        Call GetWindowRect(Me.hwnd, WindowRect)
        Call ClipCursor(WindowRect)
    Else
        Call ClipCursor(ScreenRect)
    End If
End Sub

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 24.11.2003 (Пн) 21:30

Меня всегда поражало, как можно выкладывать примеры которые не работают. Ладно бы просто не работали, так вообще не запускаются по причине ошибок в коде. :)
Особенно когда с какого нибуть иностранного сайта скачиваешь его.
Но это я так, просто отступление :)

Amed, несовсем, но я попытаюсь разобратся.
Кстати, попробуйте вставить этот код и посмотреть что получается. Ооочень интересные эффекты :)

skiperski, на этом месте
Call GetClipCursor(ScreenRect)
пишет функция нот дефайнд.

Тем не менее, спасибо за ответы.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 25.11.2003 (Вт) 1:35

Идея такова ...
раз тебе не нравится варианты выше то действуй логический
если не получается сделать программно, действуем психологически

Код: Выделить всё
Private Sub Form_Load()
PP = "Внимание! Дорогой  мой  пользователь," + vbCrLf
PP = PP + "если курсор выйдет за пределы формы," + vbCrLf
PP = PP + "то компьютер перезагрузится." + vbCrLf
MsgBox PP, 48, " Предупреждение!"
End Sub
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.11.2003 (Вт) 5:14

А потом сразу:

Me.Move 0,0,2500,2500

Randomize
SetCursorPos 500+rnd*250, 500+rnd*250

ExitWindowsEx EWX_FORCE, 0

Это чтобы не расслаблялся :wink:

GreenT - замени Call GetClipCursor(ScreenRect) на Call ClipCursor(ScreenRect)

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.11.2003 (Вт) 13:12

GreenT писал(а):Меня всегда поражало, как можно выкладывать примеры которые не работают. Ладно бы просто не работали, так вообще не запускаются по причине ошибок в коде. :)

skiperski, на этом месте
Call GetClipCursor(ScreenRect)
пишет функция нот дефайнд.

А вот меня всегда поражало и до сих пор поражает хамство и наглость со стороны спрашивающих. Ещё кто-то древний сформулировал минимально допустимое поведение просящих: "Не кусай руку дающую".

Объявить самому уже никак? Просто скопировать из API Viewer? Да даже по аналогии с другими декларациями можно пораскинуть мозгами и самому написать. Этот пример выдран из объёмной программы. Я пытался его минимизировать чтобы остался прозрачный для понимания код. Случайно удалил одну декларацию. Получил выговор от автора топика за его же нежелание думать. У меня на этом всё.

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 25.11.2003 (Вт) 19:24

Ну что вы, уважаемый skiperski. Я ни в коей мере не хотел вас обидеть. Я вас глубоко признателен за Вашу помощь и за то вы тратите своё личное время отвечая на мои глупые вопросы :?

Моё замечание относилось не к вам, а было сделано вообще :)

Я бы из API Viewer скопировал, да только не знаю какую функцию там искать. И обьявил бы, если бы знал что. :roll:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.11.2003 (Вт) 20:00

GreenT писал(а):Моё замечание относилось не к вам, а было сделано вообще :)

Ладно, проехали.

GreenT писал(а):Я бы из API Viewer скопировал, да только не знаю какую функцию там искать. И обьявил бы, если бы знал что. :roll:

А вот это уже программисту не простительно.

на этом месте
Call GetClipCursor(ScreenRect)
пишет функция нот дефайнд.

Эта чья цитата? Что компилятор сообщает? Какую функцию надо задекларировать?
Думай, думай, думай!

Или без даже API Viewer'а посмотри на декларацию GetWindowRect. Никаких ассоциаций?
Думай, думай, думай!

ЗЫ:
Amed писал(а):замени Call GetClipCursor(ScreenRect) на Call ClipCursor(ScreenRect)

Вредный совет, потому как не правильный.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 26.11.2003 (Ср) 1:16

Amed писал(а):А потом сразу:

Me.Move 0,0,2500,2500

Randomize
SetCursorPos 500+rnd*250, 500+rnd*250

ExitWindowsEx EWX_FORCE, 0

Это чтобы не расслаблялся :wink:

GreenT - замени Call GetClipCursor(ScreenRect) на Call ClipCursor(ScreenRect)


предлагается вариант проще... если курсор мыши остановится хотябы на секунду - РЕСТАРТ, и используя MouseMove следить .... когда зверь наведет на чего-нить кроме формы .... тогда включается таймер и делает РЕСТАРТ :)



[/code]
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 9

    TopList