Эмуляция мыши в другой программе - PullRequest
6 голосов
/ 01 января 2012

Я работаю над собственным программным обеспечением для управления мышью на моем компьютере с использованием C # и kinect SDK.Я действительно хочу попробовать использовать его, чтобы играть в такую ​​игру, как Red Alert, или что-то вроде RTS, или даже просто для общей навигации.

Проблема, которую я обнаружил, заключается в том, что при использовании программы с другиммыши, например, при красном оповещении или при переходе на виртуальную машину, где интеграция с мышью не поддерживается, программа не будет воспринимать вызовы, которые программа C # делает с вызовами System.Windows.Forms.Cursor, не говоря уже о вызовах mouse_event,Я новичок в области взаимодействия с Windows, и что здесь происходит, может кто-нибудь объяснить / представить решение?

- ОБНОВЛЕНИЕ-- В качестве обновления, я все еще не совсем уверен, что происходит, но япохоже, что нашли обходной путь для красного оповещения, в частности;

Поскольку красное оповещение - довольно слабая графическая программа, тривиально запустить его на виртуальной машине специально для меня, рабочей станции vmware с клиентом XP.Если вы используете код mouse_event, он работает хорошо, ОДНАКО, то, с чем я боролся, находило правильный код, представляющий движение мыши.Казалось бы, флаг MOVE перемещает мышь относительно, чего я не хотел, а абсолютный тег вообще не двигал мышь.Фактически, ИЛИ из них производит абсолютное движение на экране, поэтому мой код для движения мыши и эмуляции щелчка в итоге выглядел так:

mouse_event((int)0x00000002, cursor.X, cursor.Y, 0, 0);

для нажатия и

mouse_event((int)(0x00000001 | 0x00008000), x, y, 0 0);

для движения мыши, где x и y - новые координаты из 65535 (абсолютный диапазон).Это идеально?Неа.Но это работает на данный момент.Я думаю, что это как-то связано с тем, как windows игнорирует определенные программы при запуске ra, возможно из-за режима совместимости?У меня нет другой игры для тестирования, но я опубликую результаты в режиме несовместимости в будущем.

  • Пит

(Это не позволило бы мне опубликовать ответ в течение еще двух часов, и я должен спать, чтобы успеть на рейс утром!)

1 Ответ

1 голос
/ 01 января 2012

Вам нужно будет сделать несколько сообщений Windows низкого уровня, чтобы заставить это работать должным образом.Игры, использующие DirectX, такие как Red Alert, вообще не будут смотреть на System.Windows.Forms.Cursor.Вам нужно будет взаимодействовать с Windows User32.dll, чтобы отправлять соответствующие сообщения в Windows, чтобы он мог соответствующим образом перенаправить их в другие приложения.

Вот код, который поможет вам начать поиск сообщений черезUser32 DLL в C #:

    [DllImport("USER32.DLL")]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

    // Activate an application window.
    [DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

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

Удачи.

...