2012-11-30 3 views
1

가능한 중복 나던 : 나는 시도
How to simulate Mouse Click in C#?작업을

Window = FindWindow(null, "untitled - Paint"); 
PostMessage(WindowToFind, WM_MOUSEMOVE, 0, location); 
PostMessage(WindowToFind, WM_LBUTTONDOWN, ((int)Keys.LButton), location); 

위치 100x100 등 내가 의심에 대한 100 * 0x10000 + 100입니다 그것의 잘못. 을 0으로 바꾸려고 시도했지만 작동하지 않았습니다. 난 thread.sleep 사이에 넣어 lbuttondownlbuttonup (잘 postmessage는 thread.sleep없이 기다려야하지만 뭐든간에) 나는을 mousemove에 사용하고 0x0202을 왼쪽 버튼에 사용한다.

전혀 작동하지 않는 이유가 없습니다.

+2

시도해 보셨습니까? 창을 앞에두고 실제로 클릭해야하는 http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c –

+0

그것을 시뮬레이션하려고하는 im. (나는 단지 코드를 읽었고, 틀린 것 같아서 어떤 창문도 보지 못했습니다.) 여전히 고맙습니다. –

답변

3

맞습니다. . 그들은 일 수도 있습니다. 가끔 그런 일을하기도하지만, 여러분이 의지해야 할 것이 아닙니다. 대부분의 시간은이므로 작동하지 않을 것입니다.

대신 마우스 이벤트를 올바르게 합성하려면 SendInput function을 사용해야합니다. 다른 Win32 API 함수와 마찬가지로 C#에서 호출하려면 P/Invoke가 필요합니다. 이 정의는 설명서에서 수동으로 생성하거나 elsewhere on the Internet을 쉽게 찾을 수 있습니다. 유일한 까다로운 부분은 함수 자체뿐만 아니라 적절한 구조를 선언해야한다는 것입니다.

mouse_event function는 마우스 이벤트를 합성하는 방법으로 SendInput에 추가로 존재하지만, 링크 된 문서는 명확하게,이 기능은 SendInput 대체되었습니다. 새 응용 프로그램에서는 항상 SendInput을 사용하는 것이 좋습니다.

유일한 차이점은 이러한 마우스 이벤트를 다른 응용 프로그램으로 보내려고한다는 것입니다. SendInput은 단순히 키보드/마우스 스트림에 이벤트를 주입하기 때문에 조금 문제가 될 수 있습니다. 그들을 처리하는 응용 프로그램은 전경 창이있는 응용 프로그램이 될 것입니다. 따라서, 먼저 다른 창에 초점을 맞추고 UIPI와 충돌하지 않도록해야합니다.

다른 레벨에서는 상대적으로 취약한 코드가 있습니다. 다른 이름으로 문서를 저장하자마자 페인트 윈도우의 이름이 바뀝니다. Windows 9가 Paint를 다른 이름으로 바꾸지 않는다고 가정합니다. 이전에 그런 일이 있었는데이 응용 프로그램은 "Paintbrush"로 알려져있었습니다. 다행히도 이것은 당신이 성취하고자하는 어떤 것의 샘플 일뿐입니다. 어느 쪽이든, 맹목적으로 입력을 주입하는 대신 더 강력한 자동화 방법 (예 : Microsoft UI Automation 프레임 워크)을 검토하는 것이 좋습니다.

+0

아아 나는 페인트로 그걸 시도하고 있었다. sendinput가 초점을 요구하는 것 같습니다, 오해하면 미안 해요. "강력한 자동화 방법"을 자세히 설명해 주시겠습니까? "ui automation"은 관련성이없는 것처럼 보입니다. 자동으로 ui를 수정 한 것을 읽었습니까? –

관련 문제