일반 유틸리티를 보면, 프로그램이 시작되면서, 트레이 아이콘으로 최소화 되어 실행되는 유틸이 많이 있습니다. 저도 비슷하게 구현하려고 했는데, 문제가 좀 있어서 이렇게 고수님들의 도움을 좀 얻고자 글을 올립니다.
일단 윈도우를 최소화하여 실행하는 것은 아무 문제가 없었습니다.
WindowState:=wsMinimized; 코드를 OnFormCreate 이벤트에 넣어 주니 잘 동작을 하더군요. 한데 문제는 최소화 된 상태에서 트레이 아이콘으로 실행된 모습처럼 보이기 위해서는 태스크 바에서 현 프로그램을 제거해야 되겠기에 여기 팁란에서 찾은 다음의 코드를 추가했습니다.
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW );
그런데, 문제는 이런식으로 코드를 추가하다 보니까, 툴 윈도우를 최소화 시키면, 왼쪽 하단에 최소화된 윈도우 모양이 그대로 남더군요. 별별 코드를 다 넣어봐도 잘 안되더군요.
그런데, 문제는 위의 태스크 바에서 프로그램을 숨기는 코드가 다른 곳에선 아무 이상없이 잘 됩니다.
Hide;
ShowWindow(Application.handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW );
버튼을 하나 두고, 버튼에 위와 같은 코드를 삽입하면, OnFormCreate에 삽입했을 경우와는 달리 남는 폼이 전혀 없이 깨끗하게 사라지더군요. -_-; 폼이 생성될 때, 윈도우를 새로 보여주는 루틴을 막기만 하면 될것 같아서, Visible 속성을 false로 해도 안되었습니다. 트레이 아이콘을 사용하기 위해서 RxTrayIcon을 사용했습니다. 트레이 아이콘을 더블 클릭했을 때는 다시 윈도우를 보여주기 위해서
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) xor WS_EX_TOOLWINDOW );
ShowWindow(Application.handle, SW_SHOW);
Show;
이렇게 했습니다. 윈도우가 전체 나타난 상태에서는 잘 동작하는데, 처음 실행하지마자 트레이로 보내기를 어떻게 구현해야할지 조언 바랍니다.
지금 생각이 났는데, 한가지 방법이 있겠군요.
트레이 아이콘을 보여주는 프로그램을 따로 하나 구현한 후에, 메인 프로그램을 화면에서 숨기는 방식으로 하면 될것 같군요. 두 프로세스간의 통신이 좀 문제겠지만, 어렵진 않을 듯... 한번 구현해 본 후에 잘 되면, 다시 답변으로 올리겠습니다.
그래도, 이런 방법 말고, 간단하게 그냥, 한 프로그램에서 해결할 수 있는 방법이 있을 듯 한데 말이죠. ^^;
안녕하세요.
프로젝트소스에 Application.ShowMainForm:= False를 집어넣어 보세요.