2015-01-27 3 views
-1

이것은 내 마음을 망쳤습니다. 필자는 일부 데스크톱 작업의 매크로 자동화를 목표로하는 Java 프로젝트를 리버스 엔지니어링합니다. 실제 커서를 움직이는 다른 프로그램과 달리이 프로젝트는 WinApi를 통해 메시지를 보냅니다. 이것은 실제 사용자 입력이 중단되지 않고 다른 프로그램이 영향을받지 않는 동안 응용 프로그램이 클릭/입력 된 것으로 생각하게 만듭니다. 오래전에 비슷한 일을 생각했지만 그 방법을 몰랐습니다. sendMsg이 winapi SendMessage 전화 둘러싼winapi SendMessage는 키보드에서 어떤 문자를 입력 할 수 있습니까?

public void typeString(String text) { 
    for (char key : text.toCharArray()) { 
    sendMsg(258, key, 0); 
    } 
    } 

:

SendMessage(hwnd, 258, key, 0); 

글쎄, 그것은이 abcd 같은 것들 작동 놀랄 없다 필드에 문자열을 입력 들어

는,이 프로젝트는 놀라 울 정도로 간단한 방법을 사용합니다. 하지만 분음 기호가있는 글자에도 효과가 있습니다.

screenshot of the code and result

은 지금은 그런 깨진 기능 키 행동이나 뭔가 같은 것을 기대했다. 그리고이 문제에 관한 내 질문은 다음과 같습니다.

  1. 모든 플랫폼에서 작동합니까? 적어도 유니 코드 어플리케이션의 경우?
  2. 어떻게 기능 키를 입력 할 수 있습니까?
+0

음, '258'은 ['WM_CHAR']입니다 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276). (v = vs.85) .aspx) 플래그. 대신에'WM_KEYDOWN'과'WM_KEYUP' 메시지가 필요 하겠지만'SendMessage'에 대한 (마지막) 두 매개 변수의 기대 값을 알아야합니다. – MadProgrammer

+0

그래서'WM_KEYDOWN'과'WM_KEYUP ' '및 [Windows Virtual KeyCode] (https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd375731%28v=vs.85%29.aspx)를 참조하십시오. – MadProgrammer

+2

[입력 시뮬레이션 WM_CHAR 메시지를 통해받는 사람이 가짜가 될 수 있지만 입력 시스템을 가짜로 만들지는 않습니다.] (http://blogs.msdn.com/b/oldnewthing/archive/2011/07/28/10190521.aspx) –

답변

1

"... 내 키보드의 모든 문자"는 실제로 키보드에 따라 다릅니다. WM_CHAR은 대상 창이 유니 코드 (CreateWindowW) 인 경우 인 경우 UTF-16 을 처리하도록 문서화되어 있습니다. BMP 외부의 문자를 지원하려면 WM_UNICHAR을 사용해야합니다.

+0

입력 해 주셔서 감사합니다. 창문이 유니 코드인지 확인해 보겠습니다. –