2009-10-28 5 views
0

나는 서비스 세션에서 격리 될 때Vista 서비스 : 보이지 않는 데스크톱에 양식을 표시 할 수 있습니까?

은 물론 양식, 콘솔 사용자에게 표시되지 것입니다 (닷넷 윈폼 사용) 비스타의 서비스에서 폼을 표시하려고 시도하고 0

그러나 실험을 보이지 않는 양식을 보이고 창 핸들을 얻을 수 있는지 확인하는 것입니다.

제가 시도했지만 form.Show()를 발행 할 때 form.Load 이벤트 만 실행되지 않습니다. .FormClosing

바람을 포착 할 방법이 있습니까? 이 방법으로 사용자 응용 프로그램으로 메시지를 ws?

로그온 한 사용자와 상호 작용하고 싶지 않기 때문에 서비스를 '대화 형'으로 만들려고하지 않았습니다.

답변

0

예 서비스 데스크 톱에 양식을 표시 할 수 있습니다. 로그인 한 사용자에게는 표시되지 않으며, 실제로 비스타 및 이후 OS에서는 서비스를 '대화 형'으로 설정하더라도 사용자에게 표시 할 수 없습니다. 데스크탑은 대화 형이 아니므로 양식에 수신되는 Windows 메시지는 약간 다를 수 있지만 대다수의 이벤트는 대화식 데스크톱과 동일한 서비스에서 트리거되어야합니다 (방금 테스트를 수행하고 양식을 받았습니다. 로드, 표시, 활성화 및 닫기 이벤트).

기억해야 할 것은 폼을 표시하려면 스레드가 STA 스레드 여야하며 ShowDialog 또는 Applicaton.Run을 호출하여 메시지 루프를 만들어야합니다. 또한 양식과의 모든 외부 상호 작용을 양식 인스턴스의 Invoke 또는 BeginInvoke를 사용하여 올바른 스레드로 마샬링해야합니다.

이것은 확실히 할 수 있지만 실제로는 전혀 권장하지 않습니다. 어떠한 경우에도 양식 및 포함 된 구성 요소가 예기치 않은 UI (예 : 메시지 상자)를 표시하지 않도록해야합니다. 이 방법이 실제로 정당화 될 수있는 유일한 경우는 적절하게 기능하기 위해 핸들 생성이 필요한 모호한 품질의 레거시 또는 타사 도구로 작업 할 때입니다.

+0

많은 감사. 시험에서 어떻게 양식을 시작 했습니까? ShowDialog()를 시도했지만 얻었습니다. >> 'System.InvalidOperationException'응용 프로그램이 UserInteractive 모드에서 실행되고 있지 않을 때 모달 대화 상자 나 양식을 표시하는 것이 유효한 작업이 아닙니다. 서비스 응용 프로그램에서 알림을 표시하려면 ServiceNotification 또는 DefaultDesktopOnly 스타일을 지정하십시오. << 시스템이 종료 될 때 서비스의 WM_QUERYENDSESSION을 처리하기 위해이 (숨겨진) 창을 표시하고 메시지를 가져 오려고합니다. ShutdownBlockReasonCreate와 함께 종료를 취소하려고 시도합니다. –

+0

Application.Run을 my 테스트하고 잘 작동합니다. ShowDialog는 잘 작동했지만 일반적으로 2.0 프레임 워크에서 체크를 추가하여이를 허용하지 않았습니다. 개인적으로, 나는 서비스에서 종료를 취소하는 것은 좋은 생각이 아니라고 생각하지만, 정말로 그렇게하고 싶다면 제대로 작동해야한다. myFormInstance.ShowDialog 대신 Application.Run (myFormInstance)을 호출하면됩니다. –

관련 문제