2012-05-12 5 views
3

WM_LBUTTONDOWN 및 WM_LBUTTONUP 메시지를 창에 보내려고합니다 (커서를 움직이지 않고 마우스 클릭을 시뮬레이션 함).SendMessage() 함수가 작동하지 않는 이유는 무엇입니까?

내 프로그램은 많은 창문에 아주 좋은 작업,하지만 이 작동하지 않는 몇 가지가있다 :( 같이 레지스트리 편집기, 야후 메신저, 일부 파이어 폭스 사이트, 등등 ...

방법 나는 위에서 그와 함께 작업 할 수 있습니까 ??

참고 # 1 : 내가 사용하는 Win7에

참고 # 2 :. 내 코드는 단지 API와 함수를 호출하고, 특정 창 핸들을 aply되어 그 좋아,하지만 모든 창문에서 작동하지 :(

+0

레지스트리 편집기는 관리자 권한으로 실행되므로 프로그램이 Windows 메시지도 보낼 권한이 없습니다 (관리자로 실행되지 않는 경우). – Ben

답변

4

이 문제를 일으킬 수있는 UIPI 또는 사용자 인터페이스 개인 정보 격리라고하는 UAC의 또 다른 측면입니다. 승격되지 않은 프로그램이 승격 된 프로그램의 기능을 가로채는 것을 방지하도록 설계되었습니다. 확실히 Regedit.exe의 문제를 설명합니다. 프로그램이 레지스트리에 내용을 넣으라고 명령 할 수 있다면 UAC는 효과적이지 않을 것입니다. 이 제한 사항을 우회하려면 프로그램을 실행해야합니다.

또 다른 하나는 SendMessage()가 마우스 입력을 올바르게 시뮬레이트하지 못한다는 것입니다. 보내는 메시지는 보통 이고 메시지 큐에는입니다. 대신 PostMessage()를 사용해야합니다. WM_MOUSEMOVE도 에뮬레이션해야합니다.

마우스 입력을 시뮬레이트하는 올바른 방법은 SendInput()을 사용하는 것입니다. 그 중 하나는 정확히은 마우스 드라이버 동작을 에뮬레이트하므로 차이점을 프로그램에서 알 수있는 방법이 없습니다. 그러나 자동화하려는 모든 프로그램이 포 그라운드에서 실행되는지 확인해야한다는 추가 요구 사항이 있습니다. 매우 어렵습니다. SetForegroundWindow()는 충분히 신뢰할 만합니다. 따라서 실제로 무엇이든 포 그라운드 윈도우에 마우스 메시지를 보내려는 경우에만 SendInput()을 고려하십시오.

+0

Hans에게 알려 주셔서 고맙습니다. 전경에있는 창이면 매우 간단합니다. :) 그렇습니다. 커서를 이동하지 않고 클릭을 시뮬레이션하고 싶습니다. 창이 최소화되어 있기 때문입니다. 그래서 내가 대신 POSTMESSAGE를 사용한다면 더 잘 작동 할 것입니다. ?? –

+0

최소화 된 창을 클릭 하시겠습니까? 그것은 이상한 일입니다. 그 자체로 실패의 이유가 충분합니다. –

+0

저에게 UIPI 였기 때문에 Spy ++를 파고 며 모든 종류의 Post와 Send 메시지 변형을 시도해 보았습니다. 게시 해 주셔서 감사합니다. 덕분에 마침내 해결했습니다. – Fehr

0

당신은 훨씬 더 대신 SetForegroundWindowSwitchToThisWindow를 호출 할 수 있습니다 그리고 당신은 모든 구조체를 처리하지하고 있기 때문에, 훨씬 더 편안 SendInput 또는 mouse_event를 호출하거나 다음 시간의 대부분 작동합니다.

관련 문제