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;
}
}