2013-03-29 2 views
1

У меня есть сценарий, написанный в Autoit, который я пытаюсь преобразовать в C#, чтобы иметь больше возможностей с ним по дороге. Основные функции, которые он выполняет, - это отправить текст в команду (текст в игре) в игру, которую я открыл. То, что я пытаюсь сделать, это получить те же функции функции Send() в Autoit.Строки после сообщения?

Я читал и пришел к выводу, что Postmessage и Sendmessage будут лучшими, потому что они могут отправить его в окно, которое в настоящее время не активно. Есть ли способ отправить укуты с помощью PostMessage? Я попытался использовать Sendmessage, и пока он посылал ключевые нажатия в игру, некоторые из них не принимались, но сообщение, похоже, работает.

Вопрос: Можно ли отправлять строки и переменные с помощью Postmessage()? Если да, то как?

Спасибо! Я все еще новичок в C# и стараюсь сделать прыжок с более простого языка. (Autoit)

ответ

0

Вы не можете отправлять строки между процессами, используя PostMessage.

Поскольку вы пытаетесь отправить текст по границе процесса, этот текст необходимо отнести от процесса отправителя к процессу получателя. Это предполагает выделение строки в куче процесса приема. Поскольку сообщения доставляются асинхронно, должен быть механизм для получателя сообщения, чтобы освободить эту упорядоченную строку. Но такого механизма нет.

Даже для синхронных сообщений, поставляемых с SendMessage, только определенные сообщения выполняют строковое сортирование. Только сообщения, которые определены системой и предназначены для переноса полезной нагрузки строки, выполняют кросс-процессное сортирование. И даже тогда, это только сообщения, которые предназначены для использования кросс-процесса. Таким образом, вы не можете использовать пользовательские сообщения для отправки кросс-процессов строк с помощью SendMessage.

Вам нужно будет найти более эффективный механизм IPC. Или отправьте текстовый символ по символу.

+0

Ну, что отстой. Есть ли какой-нибудь метод для этого? Я был бы в порядке с отправкой нажатия клавиши для каждого, но половина текста является неизвестной переменной, пока программа не запустится и не создаст требуемую строку. Спасибо за быстрый ответ. – cro91

0

Если вы хотите послать ключи (что я верю Отправить делает в AutoIt), вам нужно отправить сообщение WM_KEYDOWN и отправить виртуальные клавиши, как wParam'а,:

const UInt32 WM_KEYDOWN = 0x0100; 
const int VK_A = 0x41; 

[DllImport("user32.dll")] 
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam); 

Затем, чтобы использовать его, вам нужно дескриптор окна:

var windowHandle = System.Diagnostics.Process.GetProcessesByName("someprocess")[0].Handle; 
PostMessage(windowHandle, WM_KEYDOWN, VK_A, 0); 

список кодов клавиш можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

+0

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

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

  • Нет связанных вопросов^_^