2013-03-29 2 views
1

필자는 Autoit으로 작성된 스크립트를 사용하여 더 많은 기능을 C#으로 변환하려고 시도하고 있습니다. 그것이 끝내는 주요 기능은 내가 열어 둔 게임에 명령 (게임 내 텍스트)에 텍스트를 보내는 것입니다. 내가 뭘 하려는지 Autoit에서 Send() 함수의 동일한 종류의 기능을 얻을 수 있습니다.메일 메시지 문자열?

저는 Postmessage와 SendMessage가 현재 활성화되지 않은 창으로 보낼 수 있기 때문에 가장 좋을 것이라고 결론을 내 렸습니다. PostMessage로 불량을 보내는 방법이 있습니까? 나는 Sendmessage를 사용하려고 시도했고, 키 누름을 게임에 전송하는 동안 일부는 수락되지 않았지만 메시지가 제대로 작동하지 않는 것 같습니다.

질문 : Postmessage()로 문자열과 변수를 보낼 수 있습니까? 그렇다면 어떻게?

감사합니다. 저는 C#에 익숙하지 않고 간단한 언어로 도약하려고합니다. (Autoit)

답변

0

PostMessage을 사용하여 프로세스간에 문자열을 보낼 수 없습니다.

프로세스 경계를 ​​넘어 텍스트를 보내려고하기 때문에 해당 텍스트를 보낸 사람 프로세스에서받는 사람 프로세스로 마샬링해야합니다. 그것은 수신 프로세스의 힙에 문자열을 할당하는 것을 포함합니다. 메시지는 비동기 적으로 전달되기 때문에 메시지의 수신자가 정렬 된 문자열을 해제 할 수있는 메커니즘이 필요합니다. 그러나 그러한 메커니즘은 존재하지 않는다.

SendMessage과 함께 제공된 동기 메시지의 경우에도 특정 메시지 만 문자열 마샬링을 수행합니다. 시스템에서 정의하고 문자열 페이로드를 전달하도록 설계된 메시지 만 프로세스 간 마샬링을 수행합니다. 그리고 심지어는 교차 프로세스에 사용되는 메시지 만 있습니다. 따라서 사용자 정의 메시지를 사용하여 SendMessage으로 교차 처리 문자열을 보낼 수 없습니다.

더 많은 IPC 메커니즘을 찾아야합니다. 또는 문자를 문자로 보냅니다.

+0

잘 안됐다 당신은 창 핸들이 필요합니다. 실제로 그것을 달성 할 수있는 방법이 있습니까? 나는 각자를위한 키 스트로크를 보내는 것으로 괜찮을 것이다. 그러나 텍스트의 절반은 프로그램이 실행되고 필요한 문자열을 생성 할 때까지 알려지지 않은 변수이다. 빠른 답변 감사합니다. – cro91

0

당신이 키를 보낼 경우, WM_KEYDOWN 메시지를 보내와의 wParam으로 가상 키를 보낼 필요 (I 보내기 믿는되는 AutoIt을에서 수행) :

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