2009-09-18 5 views
5

Windows 서비스에서 프로세스를 실행하고 거기에서 스크린 샷을 얻어야합니다.Windows 서비스에서의 프로세스 스크린 샷

우리는 BitBlt 및 PrintWindow Win32 호출을 시도했지만 둘 다 빈 (검정색) 비트 맵을 제공합니다.

일반적인 사용자 프로세스에서 코드를 실행하면 정상적으로 작동합니다.

심지어 이것이 가능한 것입니까? 아니면 시도 할 다른 방법이있을 수 있습니까?

상황이 우리가 시도 : 로컬 시스템으로

  1. Windows 서비스가 로컬 시스템으로 실행, 프로세스를 실행 -> 스크린 샷은 관리자 권한으로 실행
  2. Windows 서비스 실패, 관리자로 프로세스를 실행 -> 스크린 샷이 실패합니다.
  3. 사용자 XYZ로 실행되는 Windows 응용 프로그램은 XYZ -> screenshot이 BitBlt 또는 PrintWindow와 함께 작동하는 프로세스를 실행합니다. 윈도우가 다른 창 뒤에있는 경우 우리는 또한에서 PrintWindow 우리의 경우에 더 잘 작동 것으로 나타났습니다

로컬 시스템에서 "서비스와 데스크톱 상호 작용 허용"체크 시도

  • , 그것은 작동합니다.

    다른 요구 사항의 경우 상위 프로세스와 하위 프로세스가 모두 동일한 사용자이어야합니다. 우리는 한 프로세스에서 다른 프로세스로 가장 (impersonation)을 사용할 수 없습니다.

  • +1

    서비스가 데스크톱과 상호 작용하도록 허용 했습니까? –

    +0

    아주 좋은 생각 이었지만 작동하지 않았습니다. 관리자 사용자로 실행했을 때도 마찬가지였습니다. 사용자는 관리 콘솔에서 '서비스가 데스크톱과 상호 작용할 수 있도록 허용'을 선택할 수 없습니다. 비활성화되어 있습니다. – jonathanpeppers

    +0

    검색하는 사람은 [서버 데스크탑 세션 캡처 화면]을 참조하십시오. (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

    답변

    3

    나는 이것이 가능하지 않다고 생각합니다.

    응용 프로그램이 서비스에서 시작되지 않은 시나리오를 변경해야했지만 모퉁이에 NotifyIcon이있는 표준 Windows 프로그램이었습니다.

    누군가가 여전히 실제 답변을 찾으면 알려주세요.

    3

    "서비스와 데스크톱 상호 작용 허용"을 선택하여 로컬 시스템으로 실행하려 했습니까?

    +0

    +1 - 작동하는 것이 좋습니다. 그것은 확실히 내가 생각할 수있는 유일한 해결책입니다. – David

    +0

    위의 코멘트를 참조하십시오. – jonathanpeppers

    -1

    그것은으로 로컬 시스템을 사용하여 작동하는 "데스크톱과 상호 작용하도록 서비스를 허용"

    당신은 프로그래밍 방식이 샘플 코드를 사용하여 설정할 수 있습니다

    http://www.vbforums.com/showthread.php?t=367177 (그것의 vb.net하지만 매우 간단)

    +0

    이것은 XP에서만 작동합니다. 비스타 또는 7 아닙니다. 그리고 XP에는 두 가지 단점이 있습니다. 1.이 기능을 활성화하면 서비스 내에 네트워크 연결을 생성하여 문제가 발생할 수 있습니다. 2. 로그인 한 첫 번째 사용자의 바탕 화면에만 표시됩니다. 두 번째 사용자로 빠르게 전환하면 아무 것도 볼 수 없습니다. – Oliver

    +0

    Ad.1 네트워크 연결? 스크린 샷을 만드시겠습니까? Ad.2 네, 맞습니다. 세션 0 격리로 인해 Vista/7에서 작동하지 않습니다. – ufoq

    6

    현재 해당 링크를 찾을 수 없지만 문제는 Windows 서비스가 일반 사용자 응용 프로그램이 아닌 다른 세션에서 실행된다는 것입니다.

    XP에서 이것은 완전히 사실이 아니 었습니다. 다음은 세션 0에서 시작된 모든 서비스입니다. 시스템에 로그인 한 첫 번째 사용자도 세션 0에서 실행됩니다. 따라서이 경우 과 같은 트릭이 데스크톱과 상호 작용할 수 있도록 허용합니다. 그러나 다른 사용자에게 빠르게 전환하면 세션 1을 얻게되고 직접 서비스와 상호 작용할 기회가 없습니다. RDP를 통해 서버 버전 (예 : 2003 또는 2008)에 연결하는 경우에도 마찬가지입니다. 이 로그인은 0보다 높은 세션에서도 시작됩니다.

    데스크톱과의 상호 작용을 사용하여 또 다른 단점이 있습니다.
    이 옵션을 사용하면 서비스가 (기본) SYSTEM 계정으로 실행되고 있으면 네트워크 연결을 만들 수 없습니다 더 이상.

    서비스와 함께 작동하는 사용자 지정 GUI를 얻는 올바른 방법은 두 프로세스로 구분하고 일종의 IPC (프로세스 간 통신)를 수행하는 것입니다. 따라서 시스템이 시작되고 GUI 세션이 사용자 세션에서 시작될 때 서비스가 시작됩니다. 이 경우 GUI는 스크린 샷을 만들어 서비스에 전송할 수 있으며 서비스는 원하는대로 할 수 있습니다.