26 |
|
|
27 |
#define snprintf _snprintf |
#define snprintf _snprintf |
28 |
|
|
29 |
bool bHooked = false; |
HHOOK hCbtProc = 0; |
30 |
bool bHooked2 = false; |
HHOOK hShellProc = 0; |
31 |
bool bHooked3 = false; |
HHOOK hWndProc = 0; |
|
HHOOK hhook = 0; //cbt |
|
|
HHOOK hhook2 = 0; //shell |
|
|
HHOOK hhook3 = 0; //wnd proc |
|
32 |
HINSTANCE hInst = 0; |
HINSTANCE hInst = 0; |
33 |
HANDLE m_vcHandle = 0; |
HANDLE m_vcHandle = 0; |
34 |
|
|
77 |
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) |
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) |
78 |
{ |
{ |
79 |
if ( nCode < 0 ) { |
if ( nCode < 0 ) { |
80 |
return CallNextHookEx( hhook3, nCode, wParam, lParam ); |
return CallNextHookEx( hWndProc, nCode, wParam, lParam ); |
81 |
} |
} |
82 |
|
|
83 |
char windowTitle[ 150 ] = { "" |
char windowTitle[ 150 ] = { "" |
90 |
CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam; |
CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam; |
91 |
LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE ); |
LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE ); |
92 |
WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam; |
WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam; |
93 |
RECT *rect = ( RECT * ) details->lParam; |
RECT rect; |
94 |
|
|
95 |
switch ( details->message ) { |
switch ( details->message ) { |
96 |
|
|
97 |
case WM_SIZING: |
case WM_WINDOWPOSCHANGED: |
98 |
case WM_MOVING: |
if ( !( dwStyle & WS_DLGFRAME ) ) |
|
if ( !( dwStyle & WS_VISIBLE ) ) |
|
99 |
break; |
break; |
100 |
|
|
101 |
if ( !( dwStyle & WS_DLGFRAME ) ) |
if ( wp->flags & SWP_NOMOVE && wp->flags & SWP_NOSIZE ) |
102 |
break; |
break; |
103 |
|
|
104 |
|
if ( !GetWindowRect( details->hwnd, &rect ) ) { |
105 |
|
SendDebug( "GetWindowRect failed!\n" ); |
106 |
|
break; |
107 |
|
} |
108 |
|
|
109 |
snprintf( result, sizeof( result ), |
snprintf( result, sizeof( result ), |
110 |
"POSITION1,0x%p,%d,%d,%d,%d,0x%x", |
"POSITION1,0x%p,%d,%d,%d,%d,0x%x\n", |
111 |
details->hwnd, |
details->hwnd, |
112 |
rect->left, rect->top, |
rect.left, rect.top, |
113 |
rect->right - rect->left, |
rect.right - rect.left, |
114 |
rect->bottom - rect->top, |
rect.bottom - rect.top, |
115 |
0 ); |
0 ); |
116 |
result[ sizeof( result ) - 1 ] = '\0'; |
result[ sizeof( result ) - 1 ] = '\0'; |
117 |
WriteToChannel( result ); |
WriteToChannel( result ); |
118 |
|
|
119 |
break; |
break; |
120 |
|
|
121 |
|
|
128 |
WM_WINDOWPOSCHANGING event is sent which looks just like |
WM_WINDOWPOSCHANGING event is sent which looks just like |
129 |
the event that was sent when the About dialog was opened... */ |
the event that was sent when the About dialog was opened... */ |
130 |
case WM_WINDOWPOSCHANGING: |
case WM_WINDOWPOSCHANGING: |
|
|
|
|
if ( !( dwStyle & WS_VISIBLE ) ) |
|
|
break; |
|
|
|
|
131 |
if ( !( dwStyle & WS_DLGFRAME ) ) |
if ( !( dwStyle & WS_DLGFRAME ) ) |
132 |
break; |
break; |
133 |
|
|
145 |
|
|
146 |
case WM_CREATE: |
case WM_CREATE: |
147 |
if ( cs->style & WS_DLGFRAME ) { |
if ( cs->style & WS_DLGFRAME ) { |
148 |
|
|
149 |
|
if ( cs->cx < 0 || cs->cy < 0 ) |
150 |
|
break; |
151 |
|
|
152 |
snprintf( result, sizeof( result ), |
snprintf( result, sizeof( result ), |
153 |
"CREATE1,0x%p,0x%x\n", |
"CREATE1,0x%p,0x%x\n", |
154 |
details->hwnd, 0 ); |
details->hwnd, 0 ); |
155 |
result[ sizeof( result ) - 1 ] = '\0'; |
result[ sizeof( result ) - 1 ] = '\0'; |
156 |
WriteToChannel( result ); |
WriteToChannel( result ); |
157 |
|
|
158 |
|
snprintf( result, sizeof( result ), |
159 |
|
"SETSTATE1,0x%p,%s,0x%x,0x%x\n", |
160 |
|
details->hwnd, |
161 |
|
cs->lpszName, |
162 |
|
1, // FIXME: Check for WS_MAXIMIZE/WS_MINIMIZE |
163 |
|
0 ); |
164 |
|
result[ sizeof( result ) - 1 ] = '\0'; |
165 |
|
WriteToChannel( result ); |
166 |
|
|
167 |
|
snprintf( result, sizeof( result ), |
168 |
|
"POSITION1,0x%p,%d,%d,%d,%d,0x%x\n", |
169 |
|
details->hwnd, |
170 |
|
cs->x, |
171 |
|
cs->y, |
172 |
|
cs->cx, |
173 |
|
cs->cy, |
174 |
|
0 ); |
175 |
|
result[ sizeof( result ) - 1 ] = '\0'; |
176 |
|
WriteToChannel( result ); |
177 |
|
|
178 |
} |
} |
179 |
break; |
break; |
180 |
|
|
195 |
break; |
break; |
196 |
} |
} |
197 |
|
|
198 |
return CallNextHookEx( hhook3, nCode, wParam, lParam ); |
return CallNextHookEx( hWndProc, nCode, wParam, lParam ); |
199 |
} |
} |
200 |
|
|
201 |
LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam ) |
LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam ) |
202 |
{ |
{ |
203 |
if ( nCode < 0 ) { |
if ( nCode < 0 ) { |
204 |
return CallNextHookEx( hhook, nCode, wParam, lParam ); |
return CallNextHookEx( hCbtProc, nCode, wParam, lParam ); |
205 |
} |
} |
206 |
|
|
207 |
char windowTitle[ 150 ] = { "" |
char windowTitle[ 150 ] = { "" |
237 |
|
|
238 |
|
|
239 |
|
|
240 |
return CallNextHookEx( hhook, nCode, wParam, lParam ); |
return CallNextHookEx( hCbtProc, nCode, wParam, lParam ); |
241 |
} |
} |
242 |
|
|
243 |
|
|
244 |
LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam ) |
LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam ) |
245 |
{ |
{ |
246 |
if ( nCode < 0 ) { |
if ( nCode < 0 ) { |
247 |
return CallNextHookEx( hhook, nCode, wParam, lParam ); |
return CallNextHookEx( hShellProc, nCode, wParam, lParam ); |
248 |
} |
} |
249 |
|
|
250 |
char windowTitle[ 150 ] = { "" |
char windowTitle[ 150 ] = { "" |
353 |
} |
} |
354 |
|
|
355 |
|
|
356 |
return CallNextHookEx( hhook, nCode, wParam, lParam ); |
return CallNextHookEx( hShellProc, nCode, wParam, lParam ); |
357 |
} |
} |
358 |
|
|
359 |
DLL_EXPORT void SetCbtHook( void ) |
DLL_EXPORT void SetHooks( void ) |
360 |
{ |
{ |
361 |
if ( !bHooked ) { |
if ( !hCbtProc ) { |
362 |
hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL ); |
hCbtProc = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL ); |
|
bHooked = true; |
|
363 |
} |
} |
364 |
|
|
365 |
if ( !bHooked2 ) { |
#if 0 |
366 |
hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL ); |
if ( !hShellProc ) { |
367 |
bHooked2 = true; |
hShellProc = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL ); |
368 |
} |
} |
369 |
|
#endif |
370 |
|
|
371 |
if ( !bHooked3 ) { |
if ( !hWndProc ) { |
372 |
hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL ); |
hWndProc = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL ); |
|
bHooked3 = true; |
|
373 |
} |
} |
374 |
} |
} |
375 |
|
|
376 |
DLL_EXPORT void RemoveCbtHook( void ) |
DLL_EXPORT void RemoveHooks( void ) |
377 |
{ |
{ |
378 |
if ( bHooked ) { |
if ( hCbtProc ) { |
379 |
UnhookWindowsHookEx( hhook ); |
UnhookWindowsHookEx( hCbtProc ); |
|
bHooked = false; |
|
380 |
} |
} |
381 |
|
|
382 |
if ( bHooked2 ) { |
if ( hShellProc ) { |
383 |
UnhookWindowsHookEx( hhook2 ); |
UnhookWindowsHookEx( hShellProc ); |
|
bHooked2 = false; |
|
384 |
} |
} |
385 |
|
|
386 |
if ( bHooked3 ) { |
if ( hWndProc ) { |
387 |
UnhookWindowsHookEx( hhook3 ); |
UnhookWindowsHookEx( hWndProc ); |
|
bHooked3 = false; |
|
388 |
} |
} |
389 |
} |
} |
390 |
|
|