Моделирование движения мыши (C#)

Как мне сделать небольшую программу, которая продолжает двигать мышь вверх?


Для тех, кто хотел бы знать, это крошечная одноразовая вещь. Я играю в Star Wars The Force Unleashed. В консольных версиях вы должны держать правый джойстик вверх. В плохом порте консоли на ПК вы используете мышь. Может быть, вы понимаете мое разочарование.


person Vivelin    schedule 22.12.2009    source источник


Ответы (3)


SetCursorPos сделает это в неуправляемом коде. Я не уверен, есть ли способ .NET сделать то же самое, но вы всегда можете использовать com-взаимодействие. Это в User32.dll

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

небольшой google выдает это как эквивалент SetCursorPos для . нетто

System.Windows.Form.Cursor.Position
person John Knoeller    schedule 22.12.2009
comment
Это, безусловно, сдвинуло бы мышь. Но получит ли игра правильное указание на перемещение мыши? - person Corin; 23.12.2009
comment
попробуйте, он генерирует события WM_MOUSEMOVE как побочный эффект. (даже если мышь на самом деле не двигается, насколько я помню). - person John Knoeller; 23.12.2009
comment
Что ж, тогда это должно сработать без необходимости находить окно игры. - person Corin; 23.12.2009
comment
да, и это также не приведет к тому, что курсор будет где-то отличаться от последнего сообщения WM_MOUSEMOVE, полученного игрой - person John Knoeller; 23.12.2009

Это проблема механического программирования, а не CSharp.

  • Вам нужно подключить вторую мышь и купить дешевую сетевую дрель с регулируемой скоростью.
  • Наденьте на дрель шлифовальный барабан, оберните его полосатой бумагой и установите на минимальную скорость.
  • Затем наденьте на невращающийся корпус дрели кронштейн, который будет удерживать мышь своим сенсором вплотную к вращающейся полосатой бумаге.
  • Убедитесь, что мышь смотрит в правильном направлении, чтобы имитировать движение вверх.

Чтобы выполнить программу, нажмите выключатель питания на удлинителе, к которому подключена дрель.

Редактировать: если вы хотите более портативный код, используйте беспроводную дрель. Батарейки в комплект не входят.

person jball    schedule 22.12.2009
comment
Это, безусловно, сработает, но это не совсем тот ответ, на который я надеялся. Спасибо хоть. ;) - person Vivelin; 23.12.2009

Я не знаю игру, но внутри Windows отправляет сообщения о движении мыши. Они отправляются вызовом API SendMessage() в приложение. В С# вам придется либо напрямую использовать тот же API Win32, либо, возможно, путем создания/отправки события? Не уверен, как отправить событие в другое запущенное приложение.

Вызов API Win32 SendMessage(), определенный на C#, будет выглядеть следующим образом:

[DllImport("user32.dll")]
        public static extern int SendMessage(
              int hWnd,     // handle to destination window
              uint Msg,     // message
              long wParam,  // first message parameter
              long lParam   // second message parameter
              );
person Christian V    schedule 22.12.2009
comment
Это почти единственная надежда. Вопрос в том, как получить доступ к запущенной полноэкранной игре DirectX или OpenGL. - person John Rudy; 23.12.2009
comment
Я полагаю, что есть какой-то вызов API, чтобы получить все активные окна в системе и их соответствующие дескрипторы... может быть, поискать это? - person Earlz; 23.12.2009
comment
-1 Это ПЛОХАЯ идея. Сообщения WM_MOUSEMOVE — это последний шаг сложного взаимодействия между извлечением необработанного события mouse_move из очереди и несколькими сообщениями оконному процессу, включая WM_NCHITTEST и WM_SETCURSOR. Обход этих других сообщений приведет к поломке приложений, которые имеют даже немного сложную работу с мышью. - person John Knoeller; 23.12.2009