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

Annotation of /trunk/PTD/PTD.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 59 - (hide 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 werner 46 /* 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 werner 57 {
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 werner 46 return FALSE;
104 werner 57 }
105 werner 46
106 werner 57
107 werner 46 /* 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 werner 57 glob_hinst = hinst;
276 werner 46 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