TNB Library
TnbMfcCustomWindowFrameMaster.h
[詳解]
1#pragma once
12#include "TnbWindowsVersion.h"
13#include "TnbSimpleMap.h"
14#include "TnbBitFlag.h"
15
16
17
18//TNB Library
19namespace TNB {
20namespace MFC {
21
22
23
24#ifndef _TnbDOXYGEN //Document作成用シンボル
25_SELECTANY class CCustomWindowFrameMaster* g_pCwfmMaster = NULL;
26#endif
27
28
29
65{
66 DEFSUPER(CCustomWindowFrame);
67public:
68
70 CCustomWindowFrameMaster(void) : m_pCwfmOldFrame(NULL)
71 {
72 }
73
76 {
77 loop ( i, m_cwfmMap.GetSize() )
78 {
79 delete m_cwfmMap.Ref(i).val;
80 }
81 if ( m_pCwfmOldFrame != NULL )
82 {
83 delete m_pCwfmOldFrame;
84 m_pCwfmOldFrame = NULL;
85 }
86 }
87
94 void Hook(bool isDisableVista = false)
95 {
97 if ( ! isDisableVista || wv.GetOsVersion() < CWindowsVersion::WINVISTA )
98 {
99 if ( g_pCwfmMaster == NULL )
100 {
101 static CReject s_cRejeCWFM;
102 g_pCwfmMaster = new CCustomWindowFrameMaster();
103 g_pCwfmMaster->CopyParameter(*this);
104 g_pCwfmMaster->m_hCwfmCbtHook = ::SetWindowsHookEx(WH_CBT, ms_HookCbtProc, NULL, ::GetCurrentThreadId());
105 }
106 }
107 }
108
113 static void Unhook(void)
114 {
115 if ( g_pCwfmMaster != NULL )
116 {
117 delete g_pCwfmMaster;
118 g_pCwfmMaster = NULL;
119 }
120 }
121
122private:
123 //Unhook処理用サブクラス
124 class CReject
125 {
126 public:
128 ~CReject(void)
129 {
131 }
132 };
133
134 static LRESULT CALLBACK ms_HookCbtProc(int nCode, WPARAM wParam, LPARAM lParam)
135 {
136 WINDOWINFO wi = { sizeof(WINDOWINFO) };
137 HWND hWnd = reinterpret_cast<HWND>(wParam);
138 ::GetWindowInfo(hWnd, &wi);
139 LONG style = wi.dwStyle;
140// LONG styleEx = wi.dwExStyle;
141 bool canAttach = true;
142// bool isMenu = false;
143 canAttach &= ((style & (WS_DLGFRAME)) == WS_DLGFRAME);
144 if ( wi.atomWindowType == 0x8002 ) { canAttach = true; }
145 if ( wi.atomWindowType == 0xC23B ) { canAttach = true; }
146 if ( wi.atomWindowType == 0xC16A ) { canAttach = true; }
147#if 0
148 if ( wi.atomWindowType == 0xC037 && styleEx== 0x000000A8 )
149 {
150 // メニュー?
151 canAttach = true;
152 isMenu = true;
153 if ( nCode == HCBT_CREATEWND )
154 TTRACE0("↓メニュー!\n");
155 }
156 if ( wi.atomWindowType == 0x8000 && styleEx== 0x181 )
157 {
158 // メニュー?
159 canAttach = true;
160 isMenu = true;
161 if ( nCode == HCBT_CREATEWND )
162 TTRACE0("↓メニュー!\n");
163 }
164#endif
165
166 #ifdef _DEBUG
167 if ( nCode == HCBT_CREATEWND )
168 {
169 CWindowStyleBitFlag ff = wi.dwStyle;
170 TTRACE3("HCBT_CREATEWND : hWnd = 0x%08X, atom=%04X, ex=0x%08X\n", hWnd, wi.atomWindowType, wi.dwExStyle);
171 TTRACE2(" style = 0x%08X \n", wi.dwStyle, ff.ToString());
172 if ( ! canAttach )
173 {
174 TTRACE1(" -> Not Attach [0x%08X]\n", hWnd);
175 }
176 }
177 #endif
178 if ( canAttach )
179 {
180 switch ( nCode )
181 {
182 case HCBT_CREATEWND:
183 if ( ! g_pCwfmMaster->m_cwfmMap.HasKey(hWnd) )
184 {
185 //TTRACE1("Create[0x%08X] atom=%04X\n", hWnd, wi.atomWindowType);
187 g_pCwfmMaster->m_cwfmMap[hWnd] = P;
188 P->CopyParameter(*g_pCwfmMaster);
189 CBT_CREATEWND* pCBT = reinterpret_cast<CBT_CREATEWND*>(lParam);
190 if ( pCBT->lpcs->hMenu == NULL || wi.atomWindowType == 0xC256 )
191 {
192 P->Attach(hWnd);
193 //::SendMessage(hWnd, WM_ACTIVATE, 1, 0);
194 }
195 }
196 break;
197 case HCBT_MOVESIZE:
198 case HCBT_ACTIVATE:
199 if ( g_pCwfmMaster->m_cwfmMap.HasKey(hWnd) )
200 {
201 CCustomWindowFrame* P = g_pCwfmMaster->m_cwfmMap[hWnd];
202 if ( P->GetSafeHwnd() == NULL )
203 {
204 P->Attach(hWnd);
205 ::PostMessage(hWnd, WM_ACTIVATE, 1, 0);
206 }
207 }
208 break;
209 case HCBT_DESTROYWND:
210 if ( g_pCwfmMaster->m_pCwfmOldFrame != NULL )
211 {
212 delete g_pCwfmMaster->m_pCwfmOldFrame;
213 g_pCwfmMaster->m_pCwfmOldFrame = NULL;
214 }
215 if ( g_pCwfmMaster->m_cwfmMap.HasKey(hWnd) )
216 {
217 CCustomWindowFrame* P = g_pCwfmMaster->m_cwfmMap[hWnd];
218 g_pCwfmMaster->m_pCwfmOldFrame = P;
219 g_pCwfmMaster->m_cwfmMap.RemoveKey(hWnd);
220 }
221 break;
222 }
223 }
224 // 次のフックに渡す
225 return ::CallNextHookEx(g_pCwfmMaster->m_hCwfmCbtHook, nCode, wParam, lParam);
226 }
227
228 HHOOK m_hCwfmCbtHook;
230 CCustomWindowFrame* m_pCwfmOldFrame;
231};
232
233
234
235}; //MFC
236}; //TNB
BIT毎のフラグ管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
カスタムウィンドウフレームのヘッダ
簡易配列型情報管理関係のヘッダ
ウィンドウズバージョン関係のヘッダ
CStr ToString(void) const
[取得] 文字列化.
Definition: TnbBitFlag.h:101
マップ型情報管理テンプレート
Definition: TnbSimpleMap.h:44
BOOL PostMessage(UINT message, WPARAM wParam, LPARAM lParam)
[処理] PostMessage.
bool Attach(HWND hWnd)
[設定] アタッチ
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得
Windowスタイル管理クラス
Definition: TnbBitFlag.h:148
ウィンドウズバージョン情報
EOsVersion GetOsVersion(void) const
[取得] OSバージョン取得
@ WINVISTA
Windows Vista
カスタムウィンドウフレームマスタークラス.
CCustomWindowFrameMaster(void)
コンストラクタ
static void Unhook(void)
[設定] アンフック.
void Hook(bool isDisableVista=false)
[設定] フック.
カスタムウィンドウフレーム.
CCustomWindowFrame(void)
コンストラクタ
void CopyParameter(const CCustomWindowFrame &o)
[設定] 設定の複製.
TNB Library
Definition: TnbDoxyTitle.txt:2