2012-05-17 5 views
3

레거시 프로그램에서 마우스를 클릭하면 어떻게 키 입력을 시뮬레이트합니까? 노트! 이 프로그램은 마우스가 내가 돌아 -1 HookProc에서마우스 클릭을 무시하고 키보드 보내기 외부 응용 프로그램에 입력

IntPtr module = LoadLibrary("user32.dll"); 
_mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0); 

및 테스트 실험있어

를 클릭 것을 알고하지 않을 수 있습니다. 그러나 그렇게 할 때 SendInput은 입력을 응용 프로그램으로 보내지 않습니다. CallNextHookEx에서 결과를 반환하면 SendInput이 작동하지만 마우스를 클릭하면 기존 응용 프로그램이 보냅니다.

배경 우리는 특별한 키보드로 제어되는 프로그램이 있습니다. 키보드의 키를 누르면 일련의 ESC와 문자가 전송됩니다. 그런 다음 프로그램은 마우스가 화면 위에 놓인 것에 따라 작업을 수행합니다.

화면 키보드를 개발하므로이 특수 키보드 없이도 응용 프로그램을 제어 할 수 있습니다. 사용자는 마우스로 화면상의 키보드 버튼을 선택합니다. 그런 다음 사용자는 명령을 보낼 개체로 마우스 포인터를 이동 한 다음 다시 클릭합니다. 하지만 마우스 클릭이 프로그램에 전달되지 않을 수도 있습니다. 프로그램은 마우스 클릭시 다른 작업을 수행합니다.

+0

당신은 과정에 포커스가 무엇인지 알아 GetForegroundWindow + GetWindowThreadProcessId를 PInvoke를해야합니다. –

답변

2

가능한 방법 중 하나는 간단한 SendMessage를 사용하여 창 메시지를 대상 창으로 직접 보낼 수 있습니다. 외부 응용 프로그램의 창과 함께 사용할 수 있습니다. (하지만이 함수를 사용하려면 대상 윈도우의 핸들을 찾아야합니다). 이 방법으로 모든 키보드 및 마우스 이벤트를 보낼 수 있습니다.

마우스 이벤트를 무시하는 것이 더 어렵습니다. 해당 창을 하위 클래스로 분류해야합니다. 즉, 사용자 지정 창 프로 시저를 필터 창 메시지에 첨부해야합니다. 이를 위해 DLL을 제어 된 프로세스에 삽입해야합니다.
전반적인 작업은 매우 복잡합니다. 복사하여 붙여 넣을 수있는 간단한 코드 스 니펫이 아닙니다. 내가 이해하면

+0

화면 위에 투명한 창을 만들어서 해결했습니다. 마우스 클릭을 처리 한 다음 SendMessage를 마우스 아래 창에 보냅니다. – magol

0

당신이 다음 후 무엇 당신은 MouseClick과 이벤트 또는 System.Windows.Form.SendKeys을 사용하는 일부 스크립트 코드에 의해 SendKeys 매크로 수행 할 수 있습니다 -> 보내기 ({KeyBoardKey})

문서 : http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v= vs.85 % 29.aspx 입력을 보냅니다. 그러나 그것은 문제가 아닙니다. 문제는 낮은 수준의 마우스 후크를 통해받은 마우스 클릭을 무시한 후 입력을 보내는 것입니다. – magol

0

온 스크린 키보드 응용 프로그램이 레거시 응용 프로그램과 별도의 프로세스 인 경우 상당히 쉽습니다.

키보드 앱에서 사용자가 클릭 한 키를 알고 있습니다. 따라서 SendMessage() API를 사용하여 레거시 앱에이 정보를 전달하면됩니다.

실제 키보드가 ESC와 문자를 전송한다고 말합니까? 따라서 시퀀스를 명령하기 위해 키보드 키 테이블을 조회해야합니다.

또한 FindWindow()/FindWindowEx() API를 사용하여 수행 할 수있는 기존 응용 프로그램의 HWND를 가져와야합니다. 나는이 응용 프로그램이 쉽게 만들 수있는 고유 한 사용자 정의 클래스 이름을 가질 것이라고 가정합니다.여기) sendMessage 첨부를 (사용하여 명령 시퀀스 문자를 전송하는 방법의

상세 사항 :

Sending an application keystrokes with "SendMessage" (vb.net)

관련 문제