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

Diff of /trunk/PTD/PTD.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.33  
changed lines
  Added in v.57

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26