2008-11-11 10 views
1

Vista에서 Windows Aero 서비스를 활성화/비활성화하는 코드가 있는데 Windows 서비스에서 실행하고 싶습니다. 이 코드는 독립 실행 형 응용 프로그램에서 작동하지만 서비스에서 실행하면 아무 일도 일어나지 않습니다. 오류나 예외가 발생하지 않습니다.Windows 서비스에서 Aero 활성화/비활성화

서비스에서 코드를 실행하는 것이 응용 프로그램에서 코드를 실행하는 것과 다른 범위이지만이 경우 서비스에서 Aero를 활성화/비활성화하는 방법은 무엇입니까? 이것은 가능한가?

public static readonly uint DWM_EC_DISABLECOMPOSITION = 0; 
public static readonly uint DWM_EC_ENABLECOMPOSITION = 1; 

[DllImport("dwmapi.dll", EntryPoint="DwmEnableComposition")] 
protected static extern uint Win32DwmEnableComposition(uint uCompositionAction); 

public static bool EnableAero() 
{ 
    Win32DwmEnableComposition(DWM_EC_ENABLECOMPOSITION); 
} 

편집 :

그것은 DwmEnableComposition 호출 HRESULT 0x80070018, 또는 ERROR_BAD_LENGTH을 반환하는 것으로 나타났다 여기

내가 함께 일하고 코드입니다. 코드가 서비스로 실행되지 않을 때 작동하기 때문에 이상한 오류처럼 보입니다.

또한 다음 코드로 전체를 변경해 보았지만 동일한 결과가 나타납니다. 윈도우 스테이션과 데스크탑을 설정하고 올바른 것으로 보이지만 DwmEnableComposition을 호출하면 같은 오류가 발생합니다. 나는 간결함을 위해 PInvoke 선언을 포함하지 않았다.

protected override void OnStop() 
    { 
     IntPtr winStation = OpenWindowStation("winsta0", true, 0x10000000 /* GENERIC_ALL */); 
     if (winStation == null || winStation.ToInt32() == 0) 
     { 
      String err = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
     } 

     if (!SetProcessWindowStation(winStation)) 
     { 
      String err = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
     } 

     uint thread = GetCurrentThreadId(); 

     IntPtr hdesk = OpenInputDesktop(0, false, 0x10000000 /* GENERIC_ALL */); 
     if (hdesk == null || hdesk.ToInt32() == 0) 
     { 
      String err = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
     } 

     if (!SetThreadDesktop(hdesk)) 
     { 
      String err = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
     } 

     uint result = Win32DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 
     if (result != 0) 
     { 
      String err = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
     } 
    } 

답변

4

나는 64 비트 비스타에서 실행중인 서비스를 통해 WPF FlowDocuments을 만들 때 동일한 오류 코드를했다. 주위를 파고 후 나는 지적하는 this post on Microsoft Connect을 건너 수

"... 문제는 ... DWM과의 상호 운용성 문제로 인해 발생"

을 "... IIS7을 포함한 모든 서비스에서 WPF 충돌을 수정합니다."

다음은 직접 li입니다. 핫 픽스 다운로드에 nk; KB 959209

이렇게하면 64 비트 Vista를 실행하는 CruiseControl.Net (CCNet)을 통해 단위 테스트를 실행하는 데 따른 문제가 해결되었습니다. 테스트를 통해 서비스를 실행하지 않을 때 좋습니다.

1

나는 확실히 몰라,하지만 작동하기 전에 아마 당신은 현재 데스크톱과 서비스의 프로세스를 연결해야?

서비스가 데스크톱과 상호 작용할 수 있는지 확인하십시오. 그런 다음 SetThreadDesktop()을 사용하여 "Default"라는 핸들에 대한 핸들을 전달하는 서비스 스레드의 바탕 화면을 설정합니다.

아직 사용해 보지 못했지만 작동하지 않을 수도 있습니다. 하지만 시도해 볼만한 것이 있을까요?

행운을 빕니다 :)

관련 문제