2008-09-17 5 views
2

나는 우리 스튜디오에서 사용하는 다양한 개발자가 사용하는 도구 모음의 일부인 여러 응용 프로그램을 가지고 있습니다. 이러한 응용 프로그램은 주로 DOS cmd 셸을 여는 명령 줄 응용 프로그램입니다. 이러한 응용 프로그램은 차례로 이러한 명령 줄 응용 프로그램의 출력 및 상태 (소켓을 통해)를 추적하는 GUI 응용 프로그램을 시작합니다.Windows 응용 프로그램의 실행 상태 테스트

명령 줄 앱은 사용자가 워크 스테이션이 잠겨있을 때 (배치 파일을 실행 한 다음 즉시 workstaion을 잠그면) 로그인 한 상태에서 시작할 수 있으며 로그 아웃 한 경우 (예약 된 작업을 통해) . 내가 가진 문제는 마지막 두 가지 경우입니다.

사용자가 잠겨 있거나 로그 아웃 할 때 이러한 앱 중 하나가 실행되면이 명령으로 출력/상태를 추적하는 GUI 창이 생성됩니다. 괜찮아요.하지만 사용자가 워크 스테이션을 잠근 상태라고 말하면 워크 스테이션을 잠금 해제 할 때 GUI가 보이지 않습니다. 작업 목록을 실행 중이지만 표시되지 않습니다. 이러한 사용자가 다음 번에 명령 줄 앱을 실행할 때 GUI가 시작되지는 않지만 이미 실행 중이므로 데스크톱에 표시되지 않으므로 사용자는 결과를 볼 수 없습니다.

내가 찾고있는 것은 잠긴 워크 스테이션이나 (예약 된 작업을 통해) 사용자가 로그 아웃 한 경우 명령 줄 앱에서 알 수있는 방법입니다. 기본적으로 사용자의 데스크톱없이 실행됩니다. 명백한. 내가 알 수 있다면 GUI를 시작하지 않고 많은 문제를 예방할 수 있습니다.

테스트해야하는 이러한 응용 프로그램은 C/C++ Windows 응용 프로그램입니다.

나는 이것이 의미가 있기를 바랍니다.

답변

3

프로그래밍 방식의 답변을 찾았습니다. 그것은 역과 관련이 있습니다. 외관상으로는 탁상에 달리는 아무거나는 특정한 이름을 가진 역에 달릴 것입니다. 데스크톱에없는 항목 (로그 오프하거나 잠긴 워크 스테이션에서 작업 관리자가 시작한 프로세스)은 다른 스테이션 이름으로 시작됩니다. 예제 코드 : 당신은 '만약'문 들어간 경우

HWINSTA dHandle = GetProcessWindowStation(); 
if (GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded)) { 
    if (stricmp(nameBuffer, "winsta0")) { 
     // when we get here, we are not running on the real desktop 
     return false; 
    } 
} 

, 다음 프로세스가 바탕 화면에 아니지만, "다른 곳"을 실행. 필자는 데스크톱에서 실행하지 않을 때 이름 버퍼 값을 살펴 보았지만 그 이름은별로 의미가 없지만 WinSta0은 아닙니다.

문서로 연결 here. 나는 성공적으로 바탕 화면 Windows에서 잠겨 있는지 여부를 감지하는이 방법을 사용했다

1

SENS (시스템 이벤트 알림 서비스)를 사용할 수 있습니다. 나는 그것을 사용한 적이 없지만 원하는대로 할 수는 거의 확실합니다. 로그온, 로그 오프, 화면 보호기 등과 같은 이벤트에 대한 알림을 제공합니다.

매우 모호하지만 잘하면 알 수 있습니다. 너 시작 했어. 빠른 Google 검색 결과는 다음 중 하나였습니다. http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

0

: 레이몬드 첸

bool isDesktopLocked = false; 
HDESK inputDesktop = OpenInputDesktop(0, FALSE, 
      DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | 
      DESKTOP_ENUMERATE | DESKTOP_SWITCHDESKTOP | 
      DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | 
      DESKTOP_WRITE); 

if (NULL == inputDesktop) 
{ 
    isDesktopLocked = true; 
} 
else 
{ 
    CloseDesktop(inputDesktop); 
} 
관련 문제