/[winpt]/trunk/PTD/PTD.cpp
ViewVC logotype

Contents of /trunk/PTD/PTD.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 59 - (show annotations)
Wed Nov 2 13:50:48 2005 UTC (19 years, 3 months ago) by twoaday
File size: 8203 byte(s)
Removed PTD version check.

1 /* PTD.cpp - Privacy Tray Dynamic
2 * Copyright (C) 2002-2005 Timo Schulz
3 *
4 * This file is part of WinPT.
5 *
6 * WinPT is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * WinPT is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with WinPT; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19 */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <windows.h>
26 #include <windows.h>
27 #include <stdio.h>
28 #include <ocidl.h>
29 #include <olectl.h>
30
31 #include "wptJPG.h"
32
33 HINSTANCE glob_hinst;
34
35 /* We need a special section in the DLL for storing our shared data */
36 #pragma data_seg(".SHARDAT")
37 static HHOOK cbt_hook = NULL; /* CTB hook handle. */
38 static DWORD tray_proc_id = 0; /* WinPT PID */
39 static HWND shell_traywnd = 0; /* Tray window handle. */
40 static HWND curr_focus = NULL; /* Current window focus handle. */
41 static HWND rebar_w32 = NULL;
42 static HWND mstask_swc = NULL;
43 static HWND systab_c32 = NULL;
44 #pragma data_seg()
45
46 static unsigned *journ_keys = 0;
47 static unsigned key_idx = 0;
48 static unsigned nkeys = 0;
49 static HHOOK journ_hook = NULL; /* Journaling hook handle. */
50
51
52 static LRESULT CALLBACK
53 PTD_CBT_proc (int code, WPARAM wparam, LPARAM lparam)
54 {
55 HWND curr_hwnd = NULL;
56 DWORD proc_id = 0;
57
58 if (code >= 0 && code == HCBT_SETFOCUS) {
59 /* A window is about to receive the keyboard focus */
60
61 curr_hwnd = (HWND)wparam;
62 GetWindowThreadProcessId( curr_hwnd, &proc_id );
63 /* Only if the current window is different from this window list,
64 we set the new focus. For more information read the hint in
65 PTD_initialize. */
66 if ((proc_id != tray_proc_id)
67 && (curr_hwnd != NULL)
68 && (curr_hwnd != curr_focus)
69 && (curr_hwnd != shell_traywnd)
70 && (curr_hwnd != systab_c32)
71 && (curr_hwnd != mstask_swc)
72 && (curr_hwnd != rebar_w32)) {
73 curr_focus = curr_hwnd;
74 }
75 }
76
77 return CallNextHookEx (cbt_hook , code, wparam, lparam);
78 }
79
80
81 /* Return the last selected window */
82 extern "C" HWND
83 PTD_get_curr_hwnd (void)
84 {
85 return curr_focus;
86 }
87
88
89 /* Initialize CTB hook and try to find the system windows. */
90 extern "C" BOOL
91 PTD_initialize (void)
92 {
93 tray_proc_id = GetCurrentProcessId ();
94 cbt_hook = SetWindowsHookEx (WH_CBT, PTD_CBT_proc, glob_hinst, 0);
95 if (cbt_hook == NULL)
96 {
97 char buf[500];
98
99 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (),
100 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
101 buf, sizeof buf -1, NULL);
102 MessageBox (NULL, buf, "Error", MB_OK|MB_ICONSTOP);
103 return FALSE;
104 }
105
106
107 /* Okay, what are we doing here:
108 * In the past I used the Spy++ application to find out why the old current
109 * window doesn't work on so much systems. Now we try to use the computer
110 * based training hook, more precise the HCBT_SETFOCUS to find out the
111 * last window focus. But to succeed we need to ignore some windows
112 * because otherwise our own window or a window from the taskbar
113 * would be recognized.
114 *
115 * Here is what the Spy++ says about the windows order:
116 * Shell_TrayWnd
117 * \ ReBarWindow32
118 * \ MSTaskSwWClass
119 * \ SysTabControl32
120 *
121 * As a result we need to ignore those windows to prevent failured
122 * in the code.
123 */
124 shell_traywnd = FindWindowEx (NULL, NULL, "Shell_TrayWnd", NULL);
125 rebar_w32 = FindWindowEx (shell_traywnd, NULL, "ReBarWindow32", NULL);
126 mstask_swc = FindWindowEx (rebar_w32, NULL, "MSTaskSwWClass", NULL);
127 systab_c32 = FindWindowEx (mstask_swc, NULL, "SysTabControl32", NULL);
128
129 /*log_foo ("tray_proc_id=%u cbt_hook=%p shell_traywnd=%p rebar_w32=%p "
130 "mstask_swc=%p systab_c32=%p",
131 tray_proc_id, cbt_hook, shell_traywnd, rebar_w32,
132 mstask_swc, systab_c32);*/
133
134 return TRUE;
135 }
136
137
138 /* Remove the CTB hook from the system and reset all variables. */
139 extern "C" void
140 PTD_delete (void)
141 {
142 if (!cbt_hook)
143 return;
144 UnhookWindowsHookEx (cbt_hook);
145 cbt_hook = NULL;
146 shell_traywnd = NULL;
147 tray_proc_id = 0;
148 }
149
150
151 /* Return if the CTB hook is currently used. */
152 extern "C" int
153 PTD_is_used (void)
154 {
155 return shell_traywnd && cbt_hook;
156 }
157
158
159 static LRESULT CALLBACK
160 PTD_playback_proc (int code, WPARAM wparam, LPARAM lparam)
161 {
162 LPEVENTMSG em;
163
164 if (code == HC_SKIP) {
165 key_idx++;
166 if (key_idx == nkeys) {
167 UnhookWindowsHookEx (journ_hook);
168 journ_hook = NULL;
169 }
170 return 0;
171 }
172 else if (code == HC_GETNEXT) {
173 /* Here is an overview what the event message struct can contain:
174 * message - WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN:
175 * paramL - specifies the virtual key code of the key that was pressed.
176 * paramH - specifies the scan code.
177 */
178 em = (LPEVENTMSG )lparam;
179 if (journ_keys[key_idx] & 0x8000)
180 em->message = journ_keys[key_idx] & 0x4000 ? WM_SYSKEYDOWN : WM_KEYDOWN;
181 else
182 em->message = journ_keys[key_idx] & 0x4000 ? WM_SYSKEYUP : WM_KEYUP;
183 em->paramL = LOBYTE( journ_keys[key_idx] )
184 | (MapVirtualKey (LOBYTE (journ_keys[key_idx]), 0) << 8);
185 em->paramH = 1;
186 em->time = GetTickCount ();
187 return 0;
188 }
189
190 return CallNextHookEx (journ_hook, code, wparam, lparam);
191 } /* PTD_Playback_proc */
192
193
194
195 extern "C" BOOL
196 PTD_keyb_send (UINT *keys, UINT n_keys)
197 {
198 MSG msg;
199 journ_keys = keys;
200 key_idx = 0;
201 nkeys = n_keys;
202
203 if (journ_hook)
204 return FALSE;
205
206 while (GetAsyncKeyState (VK_MENU) & 0x8000
207 || GetAsyncKeyState (VK_SHIFT) & 0x8000
208 || GetAsyncKeyState (VK_CONTROL) & 0x8000) {
209 if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
210 if (msg.message == WM_QUIT) {
211 PostMessage (msg.hwnd, msg.message, msg.wParam, msg.lParam);
212 return FALSE;
213 }
214 TranslateMessage (&msg);
215 DispatchMessage (&msg);
216 }
217 }
218 journ_hook = SetWindowsHookEx (WH_JOURNALPLAYBACK,
219 (HOOKPROC)PTD_playback_proc,
220 glob_hinst, 0);
221 if (journ_hook == NULL)
222 return FALSE;
223
224 while (journ_hook) {
225 if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
226 if (msg.message == WM_QUIT) {
227 if (journ_hook)
228 UnhookWindowsHookEx (journ_hook);
229 PostMessage (msg.hwnd, msg.message, msg.wParam, msg.wParam);
230 }
231 TranslateMessage (&msg);
232 DispatchMessage (&msg);
233 }
234 }
235
236 return TRUE;
237 }
238
239
240 /* Display a JPG picture in the given window at the given point. */
241 extern "C" int
242 PTD_jpg_show (HWND hwnd, POINT *p, LPCSTR name)
243 {
244 CJPG jpg;
245 HDC hdc;
246 POINT p2;
247 BOOL rc;
248
249 rc = jpg.load (name);
250 if (!rc)
251 return -1; /* XXX: use real return code. */
252 hdc = GetWindowDC (hwnd);
253 rc = jpg.updateSizeOnDC (hdc);
254 if (!rc) {
255 ReleaseDC (hwnd, hdc);
256 return -2; /* XXX: use real return code. */
257 }
258
259 p2.x = jpg.m_Width;
260 p2.y = jpg.m_Height;
261 rc = jpg.show (hdc, p, &p2, 0, 0);
262
263 ReleaseDC (hwnd, hdc);
264 jpg.freePictureData ();
265 return rc;
266 }
267
268
269
270 BOOL WINAPI
271 DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserv)
272 {
273 switch (reason) {
274 case DLL_PROCESS_ATTACH:
275 glob_hinst = hinst;
276 break;
277 case DLL_THREAD_ATTACH:
278 break;
279 case DLL_THREAD_DETACH:
280 break;
281 case DLL_PROCESS_DETACH:
282 break;
283 }
284 return TRUE;
285 }
286

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26