2012-01-06 3 views
9

Я пишу приложение (на C#), которое как часть его должно имитировать и отправлять некоторые штрихи в другое приложение. Я использую проект http://inputsimulator.codeplex.com/ для имитации ключей, и он работает во многих приложениях, но в некоторых его нет - то есть Mortal Combat 4.Как имитировать ввод клавиатуры во ВСЕХ приложениях?

Я искал эту информацию и нашел много ответов, отличающихся от «невозможно 'to' вы должны использовать библиотеку XXX 'и т. д. Те, кто ответил, очень сильно напугали меня и даже почти убедили, что я не в состоянии сделать это в то время, НО ...

M $ Виртуальная клавиатура работает. Он работает во всех приложениях. Так что это возможно ... Кто-нибудь из вас, умные парни, знает, как я могу это достичь?

+0

какой код у вас на самом деле до сих пор, что вы пробовали ..? – MethodMan

+0

Я использую проект, о котором я упомянул выше. Самый низкий метод: [DllImport ("user32.dll", SetLastError = true)] внутренний статический extern UInt32 SendInput (UInt32 numberOfInputs, InputMsg [] входы, Int32 sizeOfInputStructure); , и он отлично работает во многих приложениях, но не для всех. :/ –

+4

@FenixVoltres: я меняю дизайн экранной клавиатуры Windows и использует тот же метод ввода, что и связанная с ним библиотека ('SendInput'). Я подключил все связанные с клавиатурой функции, которые приходили в голову ('keybd_event',' SendInput', 'SetKeyboardState' и т. Д.), И единственная функция, которая была вызвана, была' SendInput'. Попробуйте дважды проверить код библиотеки на документацию MSDN. –

ответ

6

Хорошо, я думаю, что я, наконец, получил его на работу. Я использовал API Monitor, рекомендованный Neal P, и он показал только минимальные различия между вызовами OSK и моим. Немного позже я попытался скрыть время вызова вызывающего потока между отправкой сообщений с помощью клавиши нажатия и отпускания, и это все.

+0

Для всех, кто пытается использовать API-монитор, он отображает только первый элемент массива в массиве INPUT, то есть если вы передадите массив из 4 элементов в SendItem (например, OSK делает это, когда он закрывается, чтобы имитировать LWIN-keydown, U keydown , U keyup, LWIN keyup). Чтобы увидеть весь массив в окне параметров, отредактируйте файл User32.xml в каталоге «\ API \ Windows», где установлен API-интерфейс API, и измените строку to Julius

+0

Как вам удалось заставить его работать? Я пытаюсь разобраться в одной и той же проблеме, но просто заставляя нить спать какое-то время, на самом деле ничего не решает. 'InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_0),' ' System.Threading.Thread.Sleep (1000),' ' InputSimulator.SimulateKeyUp (VirtualKeyCode.VK_0);' –

+0

любые новости на комментарий от @BogdanMolinger? – Mathias

0

Посмотрите на SendKeys на MSDN

+2

Я дал ему шанс, но такая же ситуация случается - SendKeys.Send (строка) работает, но не в каждом приложении. Блокнот или проводник правильно обрабатывают его, но я не мог заставить его работать в любой полноэкранной игре. –

+0

Большинство новых онлайн-игр прикладывают огромные усилия, чтобы попытаться скрыть людей, которые пишут программы «бот», поэтому это немного сложнее, чем говорить о нажатиях клавиш в «Блокнот». Вы все же можете обойти некоторые из своих усилий, используя низкоуровневые призывы Win32.dll api, но вы открываете себя на ответственности, конечно, в зависимости от того, где вы живете, поэтому я оставляю исследование до вас, чтобы понять это. – Bueller

+0

Ну, не могли бы вы пощадить слово или два, если эти методы не те, что я использовал? На самом деле этот проект является частью более широкой работы, которая является моим окончательным проектом бакалавриата в Университете науки и технологий AGH в Кракове, Польша, я не хочу нарушать какой-либо закон. : P Кстати, виртуальная клавиатура (или новый метод ввода компьютера в моем случае) вполне законна, я думаю? –

0

Хотя вы смогли достичь своей цели, то, как вы ее достигли, принципиально не отвечает на ваш вопрос: как имитировать ввод клавиатуры во ВСЕХ приложениях?

Существует множество ситуаций, когда обычный пользовательский режим, упомянутый в Microsoft API, не работает, как игровые приложения, использующие API DirectInput или защищенные игры.

Я создал library, который может помочь в этих ситуациях, он предоставляет простой API-интерфейс C, который внутренне связывается с драйверами фильтра устройств. Он может отправлять входные данные для игр на основе DirectInput, а также способен обойти некоторые защиты игры. Я проверил, и он все еще может обойти некоторые известные способы защиты игр, используя x64-версию библиотеки. Защита игр обычно включает только api системы x86. Ну, наконец, 18 февраля 2012 года, это то, что я вижу.

+0

Вы правы, DirectInput - моя боль в (_! _). Мне пришлось некоторое время прекратить разработку моего приложения, но я обязательно проверю вашу библиотеку в ближайшие несколько дней, похоже, это то, что я искал. –

+0

@FenixVoltres Кроме того, поскольку в настоящее время я поддерживаю простой API C, пользователь внес вклад в проект C#, который P/Invoke в github, вы можете проверить его [здесь] (https://github.com/candera /kchordr/blob/master/Program.cs) –

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