2013-02-22 7 views
6

Я приложил некоторые MouseMove и MouseClick события моей программе и рядом до это один из них:Предотвратить мыши покинуть свою форму

  1. Получить «глобальное» движение мыши, так что я могу прочитать расположение мыши даже вне формы.
  2. Не позволяйте моей мыши покинуть форму в первую очередь.

Мой проект - это игра, поэтому было бы здорово, если бы мышка не оставила мою форму, как в большинстве других игр (из. Вы можете переместить ее, если вы переключите фокус с помощью alt + tab fe.) И взгляните на ответы на другие вопросы, требующие движения глобальных движений, они кажутся довольно грязными для моих нужд.

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


Дополнительная информация об игре:

Игра короткая, 5-30 секунд игра долго выживания (она становится слишком трудно через 30 секунд, чтобы вы остались в живых), где вы должны уворачиваться от пуль с помощью мыши. Это очень раздражает, когда вы выталкиваете мышь из формы, а затем игрок (System.Windows.Forms.Panel, прикрепленный к мыши) останавливается и мгновенно попадает в пулю. Вот почему предотвращение выведения мыши из области было бы неплохо.

+7

Как I пользователь я считал бы, что грубая вещь. Может быть, было бы лучше, если бы вы просто остановили игру, когда мышь не над вашим окном? – SJuan76

+0

Просто купите немного (как комментарий, а не ответ), но это поведение серьезно меня усугубило бы. Фактически это помешало бы мне играть в такую ​​игру довольно часто (так как я обычно переключаю окна с помощью мыши) –

+0

Прочтите раздел «Дополнительная информация», который я добавил, это не проблема, поскольку мышь только заблокирован на 10-30 секунд, и вы можете совершить самоубийство в любое время. – 2013-02-22 17:05:52

ответ

4

Поздний ответ, но может пригодиться. Вы можете подписаться на форму MouseLeave и MouseMove событий и обращаться с ними так:

private int X = 0; 
    private int Y = 0; 

    private void Form1_MouseLeave(object sender, EventArgs e) 
    { 
     Cursor.Position = new Point(X, Y); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (Cursor.Position.X < this.Bounds.X + 50) 
      X = Cursor.Position.X + 20; 
     else 
      X = Cursor.Position.X - 20; 

     if (Cursor.Position.Y < this.Bounds.Y + 50) 
      Y = Cursor.Position.Y + 20; 
     else 
      Y = Cursor.Position.Y - 20;   
    } 

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

Edit:

Hans Passants's answer имеет больше смысла, чем мой ответ. Используйте Cursor.Clip на MouseEnter:

private void Form1_MouseEnter(object sender, EventArgs e) 
    { 
     Cursor.Clip = this.Bounds; 
    } 

Вы можете освободить курсор в случае какой-либо ошибки/аварии (я уверен, что вы могли бы catch'em):

Cursor.Clip = Rectangle.Empty; 
+0

Этот простой и все же каждый жалуется на это? Woah, спасибо: P – 2013-02-22 18:59:37

+0

'Убедитесь, что вы отменили подписку на события, когда игра закончена.' Если ваша программа случайно потерпела крах, то она не может отменить подписку на события, и вы остались в беде. Вот о чем все жалобы. – RobH

+0

@RobH Да, получилось: P – 2013-02-23 12:30:14

1

Вы можете использовать класс Cursor. Например:

int X = Cursor.Position.X; 
int Y = Cursor.Position.Y; 

Что касается предупреждения пользователя перемещать курсор вне формы, лучший подход, вероятно, будет, если вы были каким-то образом, чтобы знать, что координаты вашей формы на экране и прикрепить MouseMove события , и проверьте, находится ли мышь внутри прямоугольника формы.

Чтобы узнать расположение формы на экране, посмотрите на вопрос this.

2

Я не знаю решения вашей конкретной проблемы, но у меня для вас совершенно другая идея. Я не знаю, как работает ваша игра, но основываясь на том, что вы мне сказали, почему бы не сделать это еще сложнее: добавьте границы в игровую зону, например 4 пикселя в ширину прямоугольников, к которым вы не можете прикасаться. Если вы прикасаетесь к ним, вы умираете, и мышь освобождается.

+1

Другие ответы меня не успокаивали, и на самом деле это довольно хорошая идея. Не думал об этом раньше, спасибо! :) – 2013-02-22 18:01:15

4

Вы не можете запереть мышь, что помешало бы пользователю, например, запустить меню «Пуск». Ближе всего вы можете присвоить свойство Cursor.Clip. Но он легко побежден пользователем, нажав Ctrl + Esc, например, для этого нет уведомлений.

Лучше всего подписаться на деактивированное событие формы, оно надежно сообщает вам, что пользователь переключился на другую программу. Активированное событие сообщает вам, когда пользователь вернулся. Конечно, у пользователя будет несколько причин, чтобы на самом деле это сделать, когда оценка игры зависит от перемещения игрового объекта. Поэтому не забудьте дать пользователю простой способ приостановить игру, скажем, клавишей Escape.

0

Я бы не рекомендовал глобальное управление перемещением мыши по двум причинам.

  • Плохой дизайн, вы должны уважать границы операционной системы.Сделайте приложение полноэкранным, если вы хотите такого поведения. Единственными приложениями, которые должны выполнять такие операции, являются приложения режима «киоск», которые блокируют всю ОС (для предотвращения злоупотребления со стороны оператора).

  • Глобальные крючки для ключей являются беспорядочными, не гарантируется работа и опасны, поскольку они влияют на ключевую часть операционной системы (все элементы управления). Ошибка в коде может привести к перезагрузке компьютера.

Тем не менее, в последний раз я проверил (некоторое время назад, Vista) SetWindowsHookEx все еще работает (но его официально не поддерживается IIRC), это неуправляемый вызов, так что вам придется PInvoke, но с ним вы можете отказываются передавать сообщения, которые перемещают мышь за пределы вашего приложения. Я не уверен на 100%, если ОС позволит вам побить его до элемента управления курсором (я только блокировал клавиатуру раньше на ящиках для настольных компьютеров), но, вероятно, ваш лучший снимок.

Смежные вопросы