C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[56708] 태스크바에서 활성화, 비활성화 체크하여 창 상태를 변경하려고 합니다.
신나는 [shin] 1525 읽음    2009-04-22 11:11
 
안녕하세요.
찾고 삽질하고 해보고 또하다 안 돼서 질문 드려요.

메신저를 만들고 있는 중인데요,
예를 들어 메인폼에서 채팅창을 하나 띄웁니다.

채팅창의 폼 속성은 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
      이것도 이용해 보려고 했는데 잘 안되네요. 혹시 아시는 분 계시면 조금만 더 구체적으로 알려주시면 좋겠습니다.

도와주세요!!!! ㅠㅠ

 

+ -

관련 글 리스트
56708 태스크바에서 활성화, 비활성화 체크하여 창 상태를 변경하려고 합니다. 신나는 1525 2009/04/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.