Dialog기반 프로그램을 작업표시줄에서 감추고 싶다면, 간단하게 Window Style을 수정해 주면 된다.
- LRESULT CMainDlg::OnInitDialog(
- UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
- {
- ...
- ModifyStyleEx( WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,0 );
- return TRUE;
- }
문제는!!
이렇게 되면 Alt+Tab으로는 이 window를 선택할 수 없다는 점이다. 어쩌다 포커스를 잃게되면, window를 다시
찾기 상당히 귀찮아진다.
두시간의 삽질-_-을 통해 꽁수를 부려봤다. 좀 더 좋은 방법이 있다면 알려주시길~
WTL기반으로 작업했지만, MFC라도 약간만
응용하면 적용할 수 있다. (오히려 더 쉽게)
한줄요약: 작업표시줄에서는 나타나지 않으면서, Alt + Tab을 통해 활성화 되는 Dialog를 만들어 보자.
1. 바보-_- 윈도를 하나 만들자. (MFC라면 CWnd를 쓰면 되므로 이 과정은 생략)
- class CInvisibleWnd : public CWindowImpl<CInvisibleWnd >
- {
- public:
- DECLARE_WND_CLASS(NULL);
- BEGIN_MSG_MAP(CInvisibleWnd)
- END_MSG_MAP()
- };
2. WTL이라면 Run함수에서 Dialog를 생성할 것이다. (MFC라면
CWinApp::InitInstance)
이때, Dialog의 부모로 바보윈도를 설정해 준다. 눈치
채셨겠지만, 이 꽁수의 핵심은 Dialog의 부모로 설정한 바보윈도는 화면에 표시되면 안된다는 점이다.
- int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
- {
- ...
- CInvisibleWnd wndInvisible;
- wndInvisible.Create( NULL, 0, NULL, WS_OVERLAPPEDWINDOW );
- CMainDlg dlgMain;
- if ( dlgMain.Create( wndInvisible ) == NULL )
- {
- ATLTRACE(_T("Main dialog creation failed!\n"));
- return 0;
- }
- dlgMain.ShowWindow(nCmdShow);
- int nRet = theLoop.Run();
- _Module.RemoveMessageLoop();
- if ( wndInvisible.IsWindow() )
- wndInvisible.DestroyWindow();
- return nRet;
- }
그렇다. 바보 윈도는 화면에 표시되지 않고 있으니 작업표시줄에 나타나지 않지만, 인스턴스가 있으므로 Alt + Tab을 치면 나타난다! 그
인스턴스를 활성화 시켜주면 자식윈도로 등록된 Dialog가 활성되는 원리.
중요한점은, 프로그램 종료 시점에서 바보윈도또한
소멸시켜 줘야 한다는 거!
MFC라면 좀 더 쉽다. CDialog를 생성할때, 바보 윈도를 생성자의 parameter로 넘겨주기만 하면된다.
(물론, 소멸은
신경써줘야 한다.)
- BOOL CComaApp::InitInstance()
- {
- ...
- CWnd wndInvisible;
- LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
- if (!wndInvisible.CreateEx(0,
- pstrOwnerClass,
- _T(""),
- WS_OVERLAPPEDWINDOW ,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- NULL,
- 0 ))
- {
- TRACE(_T("failed to create invisible window"));
- return FALSE;
- }
- CMainDlg dlg(&wndInvisible);
- m_pMainWnd = &dlg;
- dlg.DoModal();
- if (wndInvisible.m_hWnd != NULL)
- wndInvisible.DestroyWindow();
- }
3. 이제 OnInitDialog에서 ModifyStyleEx( WS_EX_APPWINDOW,0 ); 해주면 된다.
꽁수 끄읏!