Q&A

  • application 실행시 메인폼을 보이지 않게 실행하려면..
안녕하세요.

이곳에 많이 방문했는데 등록하는 것은 이번이 처음이네요.

다름이 아니고, 제가 만들려고 하는 것은 application이 처음 실행이 될때는

메인폼이 화면에 보이지않게 실행되면서 system tray에 등록이 되고,

tray에 있는 icon을 더블클릭했을때, 또는 다른

프로그램에서 실행되도록 호출했을때에만, 화면에 보이도록 하게하고 싶습니다.

system tray에 등록하는것까지는 했는데 처음실행시 메인폼을 보이지 않게 하는 부분이 잘되지 않네요. 그래서 다음과 같이 했는데, formpaint event 를 이용하지 않고

다르게 할수 있는지 답변주시면 감사하겠습니다. 화면에 보였다가 없어지니까 좀

신경이 쓰여서요..



procedure Tfmain.FormCreate(Sender: TObject);

begin

// 외부 프로그램에서 호출했는지를 체크하는 부분

if (ParamStr(1) <> 'show') then

gb_create := false

else

gb_create := true;



// system tray에 등록하는 부분

New(NotifyStruc);

NotifyStruc^.cbSize := SizeOf(NotifyStruc^);

NotifyStruc^.Wnd := Handle;

NotifyStruc^.uID := 1;

NotifyStruc^.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;

NotifyStruc^.uCallbackMessage := WM_MYMESSAGE; {User defined message}

NotifyStruc^.hIcon := frmc1100.Image1.Picture.Icon.Handle;

NotifyStruc^.szTip := 'test';



{The auto parameter tells it to create the icon on startup}

Shell_NotifyIcon(NIM_ADD,NotifyStruc);



end;



procedure Tfmain.FormPaint(Sender: TObject);

begin

// 외부에서 호출했으면 보이게 실행하고 아니면 보이지 않게 한다.

if (gb_create = false) then begin

application.minimize;

ShowWindow(Application.Handle,SW_HIDE);

gb_create := true;

end

end;



procedure Tfmain.TrayMessage(var Msg: TMessage);

var ClassName : array[0..30] of char;

Title : array[0..20] of char;

WND : HWND;

FirstWnd : HWND;

begin

{If the right or left button is pressed then we display a message}

{If parameter auto used then we make form1 visible and show the}

{program in the taskbar}

if (Msg.LParam=WM_LBUTTONDBLCLK) then begin

SetForegroundWindow(Application.Handle);

ShowWindow(Application.Handle,SW_RESTORE);

end;

end;



4  COMMENTS
  • Profile
    박정수 2000.05.24 23:00


    델파이 팁모아란에 있는 <[팁] 시작시 최소 상태로 프로그램 실행> 에서

    해답을 구했습니다.

    application 을 최소상태로 실행한다음, taskbar 에서 없애면 되더라구요.



    답변주신분들께 감사드립니다...

  • Profile
    최석기 2000.05.24 20:10
    박정수 wrote:

    > 안녕하세요.

    > 이곳에 많이 방문했는데 등록하는 것은 이번이 처음이네요.

    > 다름이 아니고, 제가 만들려고 하는 것은 application이 처음 실행이 될때는

    > 메인폼이 화면에 보이지않게 실행되면서 system tray에 등록이 되고,

    > tray에 있는 icon을 더블클릭했을때, 또는 다른

    > 프로그램에서 실행되도록 호출했을때에만, 화면에 보이도록 하게하고 싶습니다.

    > system tray에 등록하는것까지는 했는데 처음실행시 메인폼을 보이지 않게 하는 부분이 잘되지 않네요. 그래서 다음과 같이 했는데, formpaint event 를 이용하지 않고

    > 다르게 할수 있는지 답변주시면 감사하겠습니다. 화면에 보였다가 없어지니까 좀

    > 신경이 쓰여서요..

    >

    > procedure Tfmain.FormCreate(Sender: TObject);

    > begin

    > // 외부 프로그램에서 호출했는지를 체크하는 부분

    > if (ParamStr(1) <> 'show') then

    > gb_create := false

    > else

    > gb_create := true;

    >

    > // system tray에 등록하는 부분

    > New(NotifyStruc);

    > NotifyStruc^.cbSize := SizeOf(NotifyStruc^);

    > NotifyStruc^.Wnd := Handle;

    > NotifyStruc^.uID := 1;

    > NotifyStruc^.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;

    > NotifyStruc^.uCallbackMessage := WM_MYMESSAGE; {User defined message}

    > NotifyStruc^.hIcon := frmc1100.Image1.Picture.Icon.Handle;

    > NotifyStruc^.szTip := 'test';

    >

    > {The auto parameter tells it to create the icon on startup}

    > Shell_NotifyIcon(NIM_ADD,NotifyStruc);

    >

    > end;

    >

    > procedure Tfmain.FormPaint(Sender: TObject);

    > begin

    > // 외부에서 호출했으면 보이게 실행하고 아니면 보이지 않게 한다.

    > if (gb_create = false) then begin

    > application.minimize;

    > ShowWindow(Application.Handle,SW_HIDE);

    > gb_create := true;

    > end

    > end;

    >

    > procedure Tfmain.TrayMessage(var Msg: TMessage);

    > var ClassName : array[0..30] of char;

    > Title : array[0..20] of char;

    > WND : HWND;

    > FirstWnd : HWND;

    > begin

    > {If the right or left button is pressed then we display a message}

    > {If parameter auto used then we make form1 visible and show the}

    > {program in the taskbar}

    > if (Msg.LParam=WM_LBUTTONDBLCLK) then begin

    > SetForegroundWindow(Application.Handle);

    > ShowWindow(Application.Handle,SW_RESTORE);

    > end;

    > end;

    >



    Form Create 이벤트에 다음을 넣어보시죠..

    Form Create 이벤트 시에는 화면에 아직 않보이는 시점이니까.. ^^



    ShowWindow (Application.Handle, SW_HIDE);

    Application.ShowMainForm:= False;

  • Profile
    nilriri 2000.05.24 18:56
    이곳 '델파이 팁모아'란에 있는 내용입니다.

    사용법이 정확이 맞는지 모르겠지만 이렇게 하니까

    메인폼이 화면상에 나타나지 않는군요...

    그럼...

    program Project1;



    uses

    Forms,

    Unit1 in 'Unit1.pas' {Form1};



    {$R *.RES}



    begin

    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.ShowMainForm:= False;

    Application.Run;



    end.



    박정수 wrote:

    > 안녕하세요.

    > 이곳에 많이 방문했는데 등록하는 것은 이번이 처음이네요.

    > 다름이 아니고, 제가 만들려고 하는 것은 application이 처음 실행이 될때는

    > 메인폼이 화면에 보이지않게 실행되면서 system tray에 등록이 되고,

    > tray에 있는 icon을 더블클릭했을때, 또는 다른

    > 프로그램에서 실행되도록 호출했을때에만, 화면에 보이도록 하게하고 싶습니다.

    > system tray에 등록하는것까지는 했는데 처음실행시 메인폼을 보이지 않게 하는 부분이 잘되지 않네요. 그래서 다음과 같이 했는데, formpaint event 를 이용하지 않고

    > 다르게 할수 있는지 답변주시면 감사하겠습니다. 화면에 보였다가 없어지니까 좀

    > 신경이 쓰여서요..

    >

    > procedure Tfmain.FormCreate(Sender: TObject);

    > begin

    > // 외부 프로그램에서 호출했는지를 체크하는 부분

    > if (ParamStr(1) <> 'show') then

    > gb_create := false

    > else

    > gb_create := true;

    >

    > // system tray에 등록하는 부분

    > New(NotifyStruc);

    > NotifyStruc^.cbSize := SizeOf(NotifyStruc^);

    > NotifyStruc^.Wnd := Handle;

    > NotifyStruc^.uID := 1;

    > NotifyStruc^.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;

    > NotifyStruc^.uCallbackMessage := WM_MYMESSAGE; {User defined message}

    > NotifyStruc^.hIcon := frmc1100.Image1.Picture.Icon.Handle;

    > NotifyStruc^.szTip := 'test';

    >

    > {The auto parameter tells it to create the icon on startup}

    > Shell_NotifyIcon(NIM_ADD,NotifyStruc);

    >

    > end;

    >

    > procedure Tfmain.FormPaint(Sender: TObject);

    > begin

    > // 외부에서 호출했으면 보이게 실행하고 아니면 보이지 않게 한다.

    > if (gb_create = false) then begin

    > application.minimize;

    > ShowWindow(Application.Handle,SW_HIDE);

    > gb_create := true;

    > end

    > end;

    >

    > procedure Tfmain.TrayMessage(var Msg: TMessage);

    > var ClassName : array[0..30] of char;

    > Title : array[0..20] of char;

    > WND : HWND;

    > FirstWnd : HWND;

    > begin

    > {If the right or left button is pressed then we display a message}

    > {If parameter auto used then we make form1 visible and show the}

    > {program in the taskbar}

    > if (Msg.LParam=WM_LBUTTONDBLCLK) then begin

    > SetForegroundWindow(Application.Handle);

    > ShowWindow(Application.Handle,SW_RESTORE);

    > end;

    > end;

    >

  • Profile
    박정수 2000.05.24 19:17
    그렇게 했는데도 여전히 화면에 한번 보였다가 사라집니다.

    다른부분에서 더 추가해주어야 하는부분이 있나요?



    nilriri wrote:

    > 이곳 '델파이 팁모아'란에 있는 내용입니다.

    > 사용법이 정확이 맞는지 모르겠지만 이렇게 하니까

    > 메인폼이 화면상에 나타나지 않는군요...

    > 그럼...

    > program Project1;

    >

    > uses

    > Forms,

    > Unit1 in 'Unit1.pas' {Form1};

    >

    > {$R *.RES}

    >

    > begin

    > Application.Initialize;

    > Application.CreateForm(TForm1, Form1);

    > Application.ShowMainForm:= False;

    > Application.Run;

    >

    > end.

    >