로컬 콘솔에서 프로그램이 실행 중인지 확인하는 방법은 무엇입니까?
문제
Windows Server 2003에서는 원격 세션 대신 로컬 콘솔 ( "서버 시스템의 화면")에서 내 프로그램이 실행 중인지 확인하는 방법은 무엇입니까?
Delphi Win32를 사용하고 있으므로 Windows API 기반 방법이 작동합니다 ..
해결책
세션 번호가 이것을 말하지 않습니까?
ProcessIdToSessionId (getCurrentProcessId (), & dwsessionnum)
GetVersionEx를 사용하여 OS 버전도 확인해야합니다. XP/Server 2003까지 모든 것에 대해 SESSION 0은 로컬 (서비스 또는 대화식 콘솔)입니다. 더 높은 것은 가상입니다. Vista/2008 세션 0과 1은 둘 다 로컬입니다 (0 IS 서비스, 1은 콘솔), 다른 모든 것은 가상입니다.
나는 당신의 델파이 장치가 세션 번호를 VAR로 선언 할 것이라고 추측하므로 암페어가 필요하지 않을 것입니다.
다른 팁
wtsgetActiveConsolesessionId () 콘솔에 첨부 된 세션의 ID를 반환해야합니다. 그런 다음 해당 세션 ID를 응용 프로그램의 현재 세션 ID와 비교하여 콘솔에서 실행 중인지 여부를 결정할 수 있습니다. Vista (Windows Server 2008에 대해 확실하지 않음)는 반드시 콘솔 세션에 1의 ID (빠른 사용자 스위칭, 누구입니까?)를 제공하지는 않습니다.
나를 위해 ProcessIdTossessionID는 실제 콘솔에서 직접 실행할 때와 관리 세션 (MSTSC /Admin)에 로그인 할 때 0을 반환했습니다.
그러나 RDP를 통해 로그인하면 Windows (XP Pro)는 "이 컴퓨터가 잠겨있는"디스플레이가있는 실제 콘솔에 표시되는 새 세션을 만듭니다. wtsgetActiveConsolesessionID는 제 경우에 2 세션의 세션 ID를 반환합니다.
따라서 앱이 콘솔에서 실행 중이지만 이제는 두 개의 콘솔 세션이 있으며 앱이 활성화 된 세션에서 실행되지 않습니다. 내 코드에서는 세션 ID를 대신 0과 비교합니다.
브라이언은 맞습니다. 나는 빠른 사용자 스위칭이 사용되지 않았음에도 불구하고 비스타가 대화 형 콘솔에 대해 2의 세션 ID를보고 한 후에 만났다. 물론 이것은 단지 버그 일 수 있습니다 :-)