FINGER.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:9k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //屏幕指取翻译
  2. #include "stdafx.h"
  3. #include "cspublic.h"           
  4. #include "cskernel.h"
  5. #include "finger.h"
  6. extern HINSTANCE hCsKernel ; //标识该DLL
  7. static UINT idTimer=0 ; //时间器标识
  8. static HHOOK hHook=NULL ; //钩子句柄
  9. static FARPROC lpHookProc=NULL ; //鼠标函数
  10. static FARPROC lpTimerProc=NULL ; //时间器函数
  11. static CTimer OTimer ; //时间器对象
  12. static CFingerTranslate OFingerTranslate ; //指取翻译对象
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. //挂上指取模块
  17. BOOL __export FAR PASCAL HookFingerOn( void )
  18. {
  19. //装入翻译字库
  20. if( !LoadDict() )
  21. return 0 ;
  22. return HookFingerOn1() ;
  23. /*
  24. lpHookProc =::MakeProcInstance( (FARPROC)MouseFilter , 
  25. hCsKernel) ;
  26. VERIFY( lpHookProc ) ;
  27. //挂上鼠标动作过滤函数
  28. hHook =::SetWindowsHookEx( 
  29. WH_MOUSE ,
  30. (HOOKPROC)lpHookProc , 
  31. hCsKernel , 
  32. (HTASK)NULL ) ;
  33. VERIFY( hHook ) ;
  34. lpTimerProc =::MakeProcInstance( (FARPROC)SetTime , 
  35. hCsKernel ) ;
  36. VERIFY( lpTimerProc ) ;
  37. //挂上时间器
  38. idTimer =::SetTimer( NULL , 1 , 1 , (TIMERPROC)lpTimerProc ) ;
  39. VERIFY( idTimer ) ;
  40. return TRUE;*/
  41. }
  42. //卸掉指取模块
  43. void __export FAR PASCAL HookFingerOff( void )
  44. {
  45. HookFingerOff1() ;
  46. /*     HideFinger() ;
  47. //摘掉时间器
  48. if( idTimer )
  49. {
  50. SetTimerStatus( 0 ) ; //不计时
  51. ::KillTimer( NULL , idTimer) ;
  52. ::FreeProcInstance( lpTimerProc ) ;
  53. idTimer =0 ;
  54. lpTimerProc =NULL ;
  55. }
  56. if( hHook )
  57. {
  58. ::UnhookWindowsHookEx( hHook ) ;
  59. ::FreeProcInstance( lpHookProc ) ;
  60. hHook =NULL ;
  61. lpHookProc =NULL ;
  62. }
  63. */
  64. //卸掉翻译字库
  65. UnloadDict() ;
  66. }
  67. //挂上指取模块
  68. BOOL __export FAR PASCAL HookFingerOn1( void )
  69. {
  70. lpHookProc =::MakeProcInstance( (FARPROC)MouseFilter , 
  71. hCsKernel) ;
  72. VERIFY( lpHookProc ) ;
  73. //挂上鼠标动作过滤函数
  74. hHook =::SetWindowsHookEx( 
  75. WH_MOUSE ,
  76. (HOOKPROC)lpHookProc , 
  77. hCsKernel , 
  78. (HTASK)NULL ) ;
  79. VERIFY( hHook ) ;
  80. lpTimerProc =::MakeProcInstance( (FARPROC)SetTime , 
  81. hCsKernel ) ;
  82. VERIFY( lpTimerProc ) ;
  83. //挂上时间器
  84. idTimer =::SetTimer( NULL , 1 , 1 , (TIMERPROC)lpTimerProc ) ;
  85. VERIFY( idTimer ) ;
  86. return TRUE;
  87. }
  88. //卸掉指取模块
  89. void __export FAR PASCAL HookFingerOff1( void )
  90. {
  91.     HideFinger() ;
  92. //摘掉时间器
  93. if( idTimer )
  94. {
  95. SetTimerStatus( 0 ) ; //不计时
  96. ::KillTimer( NULL , idTimer) ;
  97. ::FreeProcInstance( lpTimerProc ) ;
  98. idTimer =0 ;
  99. lpTimerProc =NULL ;
  100. }
  101. if( hHook )
  102. {
  103. ::UnhookWindowsHookEx( hHook ) ;
  104. ::FreeProcInstance( lpHookProc ) ;
  105. hHook =NULL ;
  106. lpHookProc =NULL ;
  107. }
  108. }
  109. //开始指取翻译
  110. void __export FAR PASCAL StartFingerTranslation( void )
  111. {
  112. OFingerTranslate.BeginTranslate() ;  //进行指取翻译
  113. SetTimerStatus( 2 ) ; //消失开始计时
  114. }
  115. #ifdef __cplusplus
  116. }
  117. #endif
  118. //----------------------------------------------------------------------------------------------------------//
  119. //初始化
  120. CTimer::CTimer( void )
  121. {
  122. m_nTimerStatus =0 ; //初始状态为0,不需要进行计时
  123. }
  124. //设置计时状态
  125. void CTimer::SetTimerStatus( int status )
  126. {
  127. m_nTimerStatus =status ;
  128. if( status ) //需要进行计时
  129. m_dwTime =GetTickCount() ; //得到当前时间
  130. }
  131. //设置时间
  132. void CTimer::SetTime( DWORD time )
  133. {
  134. switch( m_nTimerStatus )
  135. {
  136. case 1: //设置显示时间
  137. if( time-m_dwTime >= TO_SHOW_TIME ) //可以进行显示了
  138. StartFingerTranslation() ;
  139. break ;
  140. case 2: //设置消失时间
  141. if( time-m_dwTime >= TO_DISAPPEAR_TIME ) //要消失了
  142. {
  143. HideFinger() ; //隐藏翻译结果
  144. SetTimerStatus( 0 ) ; //不进行计时
  145. }
  146. break ;
  147. }
  148. }
  149. //每隔1毫秒调一次
  150. extern "C" void __export FAR PASCAL SetTime(
  151. HWND hwnd , /* handle of window for timer messages */
  152. UINT msg , /* WM_TIMER message */
  153. UINT idTimer , /* timer identifier */
  154. DWORD dwTime ) /* current system time */
  155. {
  156. OTimer.SetTime( dwTime ) ;
  157. }
  158. //设置计时状态
  159. void SetTimerStatus( int status )
  160. {
  161. OTimer.SetTimerStatus( status ) ;
  162. }
  163. //----------------------------------------------------------------------------------------------------------//
  164. extern "C" LRESULT __export FAR PASCAL MouseFilter( 
  165. int code, WPARAM wParam , LPARAM lParam)
  166. {
  167. if( code >=0 )
  168. {
  169. if( !GetFingerAidedKeyFlag() || //不需要指取翻译辅助键
  170. GetFingerAidedKeyFlag()==2 ) //已经按下辅助键
  171. {
  172. if( wParam == WM_MOUSEMOVE ||
  173.    wParam == WM_NCMOUSEMOVE ) //鼠标移动
  174. {
  175. POINT tempPoint ;
  176. GetCursorPos( (LPPOINT)&tempPoint ) ; //当前鼠标所在点
  177. POINT currentPoint ;
  178. //以前鼠标所在点
  179. OFingerTranslate.GetCurrentPoint( (LPPOINT)&currentPoint ) ;
  180. //移动了位置
  181. if( currentPoint.x != tempPoint.x ||
  182.  currentPoint.y != tempPoint.y )
  183. {
  184.      HideFinger() ; //隐藏以前显示的结果
  185. OTimer.SetTimerStatus( 1 ) ; //进行显示计时
  186. }
  187. }
  188. else if(
  189. wParam == WM_LBUTTONDOWN ||           
  190. wParam == WM_RBUTTONDOWN ||
  191. wParam == WM_LBUTTONDBLCLK ||
  192. wParam == WM_RBUTTONDBLCLK ||
  193. wParam == WM_NCLBUTTONDOWN ||           
  194. wParam == WM_NCRBUTTONDOWN ||
  195. wParam == WM_NCLBUTTONDBLCLK ||
  196. wParam == WM_NCRBUTTONDBLCLK )
  197.   HideFinger() ;
  198. }
  199. }
  200. //调用下一个钩子函数
  201. return CallNextHookEx( hHook , code , wParam , lParam ) ;
  202. }
  203. CFingerTranslate::CFingerTranslate( void )
  204. {
  205. m_CurrentPoint.x =-1 ;
  206. m_CurrentPoint.y =-1 ;
  207. }
  208. void CFingerTranslate::GetCurrentPoint( LPPOINT lp )
  209. {
  210. lp->x =m_CurrentPoint.x ;
  211. lp->y =m_CurrentPoint.y ;
  212. }
  213. void CFingerTranslate::BeginTranslate( void )
  214. {
  215. /* POINT tempPoint ;
  216. GetCursorPos( &tempPoint ) ; //临时点
  217. if( m_CurrentPoint.x == tempPoint.x &&
  218. m_CurrentPoint.y == tempPoint.y ) //没有移动位置
  219. return ;
  220. m_CurrentPoint =tempPoint ;
  221. */
  222. GetCursorPos( &m_CurrentPoint ) ; //得到当前点
  223. //重新显示鼠标下的字符串
  224. GetString() ;
  225. }
  226. //得到当前光标下的字符串,进行翻译
  227. void CFingerTranslate::GetString( void )
  228. {
  229. //得到当前点下的窗口
  230. HWND hParentWnd =::WindowFromPoint( m_CurrentPoint ) ;
  231. if( !hParentWnd )
  232. return ;
  233. //关闭窗口
  234. HWND closeWnd =::FindWindow( NULL , "Close Program" ) ;
  235. if( closeWnd==hParentWnd || ::IsChild( closeWnd , hParentWnd ) )
  236. return ;
  237. HWND close1Wnd =::FindWindow( NULL , "关闭程序" ) ;
  238. if( close1Wnd==hParentWnd || ::IsChild( close1Wnd , hParentWnd ) )
  239. return ;
  240. //WIN切换窗口的窗口句柄
  241. HWND alt_tabWnd =::FindWindow( "#32771" , NULL ) ;
  242. if( alt_tabWnd==hParentWnd ) //不对切换窗口处理
  243. {
  244. /* SetFingerTranslate( 2 ) ; //设成可以写
  245. //设上当前点,为了判断字符串是否在该点上
  246. SetCurrentPoint( m_CurrentPoint ) ;
  247. RECT rect ;
  248. //得到窗口大小
  249. ::GetWindowRect( hParentWnd , &rect ) ;
  250. //重画该区域
  251. ShowTempWin( rect.left , m_CurrentPoint.y , 
  252. rect.right-rect.left , 1 ) ;
  253. HideTempWin() ;
  254. */ return ;
  255. }
  256. POINT pp =m_CurrentPoint ;
  257. ScreenToClient( hParentWnd , &pp ) ;
  258. HWND hwnd =::ChildWindowFromPoint( hParentWnd , pp ) ;
  259. if( !hwnd )
  260. hwnd =hParentWnd ;
  261. // HWND hwnd =::WindowFromPoint( m_CurrentPoint ) ;
  262. // if( !hwnd )
  263. // return ;
  264. SetFingerTranslate( 2 ) ; //设成可以写
  265. //设上当前点,为了判断字符串是否在该点上
  266. SetCurrentPoint( m_CurrentPoint ) ;
  267. //---------------------------------------------------------------//
  268. /*
  269. //Notepad的窗口句柄
  270. HWND notepadWnd =::FindWindow( "Notepad" , NULL ) ;
  271. //DBWin的窗口句柄
  272. HWND dbwinWnd =::FindWindow( "DBWin" , NULL ) ;
  273. //DOS窗口的名柄
  274. HWND dosWnd =::FindWindow( "tty" , NULL ) ;
  275. //Telnet的窗口句柄
  276. HWND telnetWnd =::FindWindow( "TelnetWClass" , NULL ) ;
  277. //TeraTerm的窗口句柄
  278. HWND teratermWnd =::FindWindow( "VTWin32" , NULL ) ;
  279. //Eudora的窗口句柄
  280. HWND eudoraWnd =::FindWindow( "UIW_MDIFRAME" , NULL ) ;
  281. //中文之星WINDOS的窗口句柄
  282. HWND windosWnd =::FindWindow( "WINDOS" , NULL ) ;
  283. BOOL bFlag=0 ;
  284. if( notepadWnd )
  285. if( ::IsChild( notepadWnd , hwnd ) )
  286. bFlag =1 ;
  287. if( dbwinWnd )
  288. if( ::IsChild( dbwinWnd   , hwnd ) )
  289. bFlag =1 ;
  290. if( dosWnd )
  291. if( ::IsChild( dosWnd   , hwnd ) )
  292. bFlag =1 ;
  293. if( eudoraWnd )
  294. if( ::IsChild( eudoraWnd , hwnd ) )
  295. bFlag =1 ;
  296. if( dosWnd==hwnd || telnetWnd == hwnd || teratermWnd == hwnd || windosWnd==hwnd )
  297. bFlag =1 ;
  298. */
  299. // if( bFlag ) //需要特殊的窗口
  300. {
  301. RECT rect ;
  302. POINT tempPoint ;
  303. tempPoint =m_CurrentPoint ;
  304. ::ScreenToClient( hwnd , &tempPoint ) ;
  305. ::GetClientRect( hwnd , &rect ) ;
  306. if( !PtInRect( &rect , tempPoint ) ) //不在客户区内
  307. goto l100 ;
  308. //得到窗口大小
  309. ::GetWindowRect( hwnd , &rect ) ;
  310. tempPoint.x =rect.left ;
  311. tempPoint.y =m_CurrentPoint.y ;//rect.top ;
  312. ::ScreenToClient( hwnd , &tempPoint ) ;
  313. rect.left =tempPoint.x ;
  314. rect.top =tempPoint.y ;
  315. tempPoint.x =rect.right ;
  316. tempPoint.y =rect.bottom ;
  317. ::ScreenToClient( hwnd , &tempPoint ) ;
  318. rect.right =tempPoint.x ;
  319. rect.bottom =rect.top+1 ;//tempPoint.y ;
  320. //重画该区域
  321. // char sBuff[100];
  322. // wsprintf( sBuff , "%d %d %d %d" , rect.left , rect.top,rect.right,
  323. // rect.bottom ) ;
  324. // WritePrivateProfileString( "test" , sBuff , "ok" , "test.ini" ) ;
  325. // if( GetParent( hwnd ) )
  326. {
  327. ::InvalidateRect( hwnd , &rect , FALSE ) ;
  328. // ::SendMessage( hwnd , WM_NCPAINT , 0 , 0 ) ;
  329. ::SendMessage( hwnd , WM_PAINT , 0 , 0 ) ;
  330. return ;
  331. }
  332. // ::UpdateWindow( hwnd ) ;
  333. // ::DrawMenuBar( hwnd ) ;
  334. // ShowTempWin( rect.left , m_CurrentPoint.y , 
  335. // rect.right-rect.left , 1 ) ;
  336. // HideTempWin() ;
  337. // return ;
  338. }
  339. //重画该区域
  340. l100: ShowTempWin( m_CurrentPoint.x , m_CurrentPoint.y , 
  341. 1 , 1) ;
  342. HideTempWin() ;
  343. }