Q&A

  • 윈도우 로그온 전에 프로그램 실행 방법
안녕하세요.

다름이 아니라 제목과 같이 윈도우가 시작되고 나서 사용자 로그온 되기 전에 프로그램이 실행 되는걸 본적이 있는데요, (키오스크 같은 프로그램) 이렇게 하려면 어떻게 해야 하고, 또 주의할 점은 어떤게 있는지 등등이 알고 싶습니다.

그럼 답변 부탁드립니다. ^^
2  COMMENTS
  • Profile
    장성호 2008.09.22 11:46

    저도 정확히 잘 모릅니다만 몇가지 참조할것 적어 봅니다.

    먼저 윈도우가 시작되고 로그온 하기전에 실행되는 User모드 프로그램을 서비스밖에 없을것 같습니다.
    윈도우서비스로 프로그램을 만들어 놓고 시작모드를 자동으로 해 놓으면
    부팅된후에 로그인전에 서비스프로그램이 시작됩니다.

    그런데 서비스 프로그램은 GUI가 없습니다.
    로그인 화면에 프로그램을 띄우려면 그것만으로는 안되죠
    여기서 "Window Station과 Desktop 그리고 Session" 에 대한 이해가 좀 필요할것 같습니다.
    ( 참조 http://hongyver.pe.kr/ttblog/727 )

    간단히 정리하면
    서비스가 실행되는 desktop은 Service-0x0-3e7$\default 이구
    윈도우 로그인화면 desktop은 WinSta0\Winlogon
    사용자가 로그인후 desktop은 WinSta0\Default 로써

    Window Station 이나 desktop이 다르면 윈도우 핸들도 찾을 수 없고 프로그램 실행도 그냥은 안됩니다.

    서비스 프로그램에서 로그온한 데스트탑에 프로그램일 실행시기려면
    CreateProcess로 실행할때
    STARTUPINFO 의 lpDesktop 에 desktop이름을 적어주면 됩니다.

    STARTUPINFO si;
    si.lpDesktop="WinSta0\\Default";


    서비스에서 로그인 화면에 프로그램을 띄우는 방법에 관해서도
    위와같은 방법으로 하면되지 않을까 하고 찾아
  • Profile
    장성호 2008.09.22 19:36
    음...

    Windows XP SP3에서 테스트 해보니
    default화면에 띄울때처럼 로그인 화면에도 같은 방법으로 되네요

    아래는 간단히 테스트 해본 코드입니다.



    procedure TService1.ServiceCreate(Sender: TObject);
    var
    si: STARTUPINFO;
    pi : PROCESS_INFORMATION;
    bResult : Boolean;
    begin

    ZeroMemory( @si, sizeof(si) );
    si.cb := sizeof(si);
    si.lpDesktop:=PChar('WinSta0\Winlogon'); // 이부분이 핵심

    bResult := CreateProcess( nil, // No module name (use command line).
    'C:\Zzang\[기술예제]\DelphiToHTML\DelphiToHTML.exe', // Command line.
    nil, // Process handle not inheritable.
    nil, // Thread handle not inheritable.
    FALSE, // Set handle inheritance to FALSE.
    0, // No creation flags.
    nil, // Use parent's environment block.
    nil, // Use parent's starting directory.
    si, // Pointer to STARTUPINFO structure.
    pi ); // Pointer to PROCESS_INFORMATION structure. )

    end;



    한글이 들어가는 컨트롤이 있다면 반드시 Font.Name을 한글폰트로 하시길...