Windows 서비스가 사용자 Windows에 메시지를 보내는 특별한 고려 사항이 있습니까?

StackOverflow https://stackoverflow.com/questions/615195

문제

이벤트를 모니터링하는 Windows 서비스 응용 프로그램 (GUI 없음)을 작성해야하며, 발생하면 표준 Windows 메시지를 응용 프로그램에 보냅니다. 응용 프로그램의 핸들은 DLL에 의해 서비스에 제공되므로 언로드되므로 Windows 메시지는 사용하는 방식입니다.

그러나 문제는 서비스가 다른 화면이나 Vista의 무언가에있을 수 있다는 점을 감안할 때 서비스가 윈도우 핸들에 SendMessage를 사용하기 위해 특별한 일을 해야하는지 여부입니다. 이것이 가능합니까? 그렇다면 어떻게해야합니까?

도움이 되었습니까?

해결책

사용자 인터페이스 권한 분리 (UIPI) :

Microsoft Windows Vista 이상. 메시지 전송은 사용자 인터페이스 권한 격리 (UIPI)의 적용을받습니다. 프로세스의 스레드는 무결성 수준이 낮거나 동일한 프로세스에서 스레드의 메시지 대기열에만 메시지를 보낼 수 있습니다.

원천

당신은 읽을 수 있습니다 사용자 인터페이스 권한 격리 (UIPI).

이 문제를 해결하려면 매니페스트 파일에서 uiaccess를 true로 설정할 수 있습니다. 또한 Verisign과 같은 서명 기관의 인증서와 함께 Authenticode를 사용하여 응용 프로그램에 서명해야합니다. 이것은 꽤 비쌀 수 있습니다.


세션 0 격리 :

또한 세션에서 SendMessage를 부를 수 없다는 것도 내 믿음입니다. 따라서 세션 0에서 서비스가 실행중인 경우 세션> 0에서 실행되는 프로세스와 통신 할 다른 수단을 찾아야합니다. 예 : 파이프를 통해.

Windows Vista, Windows 2008 서버 및 나중에 모든 서비스는 세션 0에서 실행되며 세션> 0에서 실행되는 모든 응용 프로그램은 세션 0 격리라고합니다. 여기에 좋은 문서가 있습니다 세션 0 분리에 관한 정보.

메시지를 보내려는 프로그램의 소스에 액세스 할 수없는 경우 서비스와 통신하는 응용 프로그램을 작성하고 동일한 세션에서 응용 프로그램에 메시지를 전달하기위한 프록시로 작용하여이 문제를 해결할 수 있습니다. .


전반적인:

Pre-Vista에서 응용 프로그램을 개발하고 잘 작동하는 경우. 이있다 매우 높습니다 Vista에서 깨질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top