|
안녕하세요.
찾고 삽질하고 해보고 또하다 안 돼서 질문 드려요.
메신저를 만들고 있는 중인데요,
예를 들어 메인폼에서 채팅창을 하나 띄웁니다.
채팅창의 폼 속성은 bsNone 이구요. 채팅창이 뜰 때, CreateParams 에서 태스크바에 새롭게 창을 표시해 줍니다.
void __fastcall TfmChat::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = WS_EX_APPWINDOW;
Application->ModalPopupMode = pmExplicit;
Params.WndParent = GetDesktopWindow();
}
그런데 이때, WS_EX_APPWINDOW 이걸로 창을 새로 만들고
태스크바를 클릭해서 창을 비활성화 시키면 창이 최소화 되지 않습니다.
메인창은 활성화(Restore)/비활성화(Minimize) 잘 되는데, 새로 띄운 채팅창은 그게 안되네요.
그래서 메시지 맵으로 WM_ACTIVATEAPP 메시지를 잡아서 처리해보자! 생각해서
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ACTIVATEAPP, TMessage, WMActivateapp)
MESSAGE_HANDLER(WM_QUERYOPEN,TWMQueryOpen,FixedIconState)
END_MESSAGE_MAP(TForm)
void __fastcall TfmChat::WMActivateapp(TMessage &msg)
{
if ( this->Showing )
{
if (!msg.WParam && msg.LParam==hTask) // hTask :태스크바 핸들입니다.
{
SendMessage(this->Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
bOpen = false;
}
else if (msg.WParam && msg.LParam==hTask)
{
SendMessage(this->Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
bOpen = true;
}
}
}
void __fastcall TfmChat::FixedIconState(TWMQueryOpen& Msg)
{
TForm::Dispatch(&Msg);
if (!bOpen) Msg.Result = 0; // 비활성화 최소화 후 창이 바로 다시 열리는 걸 막기 위해서
}
이렇게 해봤습니다,
이 경우 채팅창이 활성화 된 상태에서 다른 창을 클릭했을 때, 채팅창이 비활성화 되면서 최소화가 되어 버립니다ㅠㅠ
(그래서 LParam에서 태스크 핸들을 잡아줬는데도 이럽니다.)
WM_ACTIVATE 메시지도 같이 잡아서 이게 마우스 클릭인지 아닌지 체크해서도 해봤는데, 역시 안 되네요.
다른 획기적으로 간단한 방법이 존재한다거나!
사실 폼 속성에서 뭘 하나만 바꾸면 된다거나!
제가 위의 함수들에서 뭔가 잘못했거나, 추가하면 된다던가!
이런 게 있다면 정말 행복할 거 같네요. 어허허헝.
PS. 밑에서 테스크바 메시지 답변에 있는 Application->HookMainWindow / ApplicationEvents
이것도 이용해 보려고 했는데 잘 안되네요. 혹시 아시는 분 계시면 조금만 더 구체적으로 알려주시면 좋겠습니다.
도와주세요!!!! ㅠㅠ
|