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

多国语言处理

开发平台:

Visual C++

  1. //全程热键
  2. #include "stdafx.h"
  3. #include "resource.h"
  4. #include "systemse.h"
  5. #include "cspublic.h"
  6. #include "cskernel.h"
  7. #include "hooks.h"
  8. extern HINSTANCE hCsPublic ; //标识该DLL
  9. CHotKeyParam OHotKeyParam ; //热键参数对象
  10. static CGetMessageParam  OGetMessageParam ; //GETMESSAGE钩子对象
  11. CHotKeyParam::CHotKeyParam( void )
  12. {
  13. m_nHotKeyNum =6 ; //热键数目
  14. //隐藏或显示浮动条
  15. m_bCharStatus[0] =1 ; //弹起时有效
  16. m_fpFunc[0] =(FARPROC)SwitchMainWin ;
  17. m_bEnable[0] =1 ;
  18. //隐藏或显示输入板
  19. m_bCharStatus[1] =1 ;
  20. m_fpFunc[1] =(FARPROC)SwitchInputBar ;
  21. if( GetPrivateProfileInt( "输入板参数" ,
  22. "输入板状态" , 1 , INI_FILE_NAME )==2 ) //禁止中文输入
  23. m_bEnable[1] =0 ;
  24. else
  25. m_bEnable[1] =1 ;
  26. //取消或启动指取翻译
  27. m_bCharStatus[2] =1 ;
  28. m_fpFunc[2] =(FARPROC)SwitchFinger ;
  29. m_bEnable[2] =1 ;
  30. //指取翻译辅助键
  31. m_bCharStatus[3] =0 ;
  32. m_fpFunc[3] =(FARPROC)AidFinger ;
  33. if( GetPrivateProfileInt( "指取翻译" , "是否进行指取翻译" ,
  34. 1 , INI_FILE_NAME ) &&
  35.      GetPrivateProfileInt( "指取翻译" ,
  36. "是否需要辅助键" , 0 , INI_FILE_NAME ) )
  37. m_bEnable[3] =1 ;
  38. else
  39. m_bEnable[3] =0 ;
  40. //向后翻页
  41. m_bCharStatus[4] =0 ;
  42. m_fpFunc[4] =(FARPROC)PageNext ;
  43. m_bEnable[4] =0 ;
  44. //向前翻页
  45. m_bCharStatus[5] =0 ;
  46. m_fpFunc[5] =(FARPROC)PagePrior ;
  47. m_bEnable[5] =0 ;
  48. m_hHookHandle =NULL ;
  49. m_bActionOk =1 ; //初始动作允许
  50. m_nHaveDoneKey =-1 ; //初始没有做过动作
  51. for( int i=0 ; i<MAX_KEYS_NUM ; i++ ) //所有键状态为弹起
  52. m_bKeysStatus[i] =1 ;
  53. //从INI文件读取当前热键状态
  54. //得到当前热键值
  55. //0为隐藏/显示浮动条热键
  56. m_bCtrl[0] =GetPrivateProfileInt( "热键参数" ,
  57. "热键1的Ctrl值" , 0 , INI_FILE_NAME ) ;
  58. m_bAlt[0] =GetPrivateProfileInt( "热键参数" ,
  59. "热键1的Alt值" , 1 , INI_FILE_NAME ) ;
  60. m_bShift[0] =GetPrivateProfileInt( "热键参数" ,
  61. "热键1的Shift值" , 0 , INI_FILE_NAME ) ;
  62. m_nChar[0] =GetPrivateProfileInt( "热键参数" ,
  63. "热键1的Char值" , 59 , INI_FILE_NAME ) ;
  64. //1为隐藏/显示输入板
  65. m_bCtrl[1] =GetPrivateProfileInt( "热键参数" ,
  66. "热键2的Ctrl值" , 1 , INI_FILE_NAME ) ;
  67. m_bAlt[1] =GetPrivateProfileInt( "热键参数" ,
  68. "热键2的Alt值" , 0 , INI_FILE_NAME ) ;
  69. m_bShift[1] =GetPrivateProfileInt( "热键参数" ,
  70. "热键2的Shift值" , 0 , INI_FILE_NAME ) ;
  71. m_nChar[1] =GetPrivateProfileInt( "热键参数" ,
  72. "热键2的Char值" , 0 , INI_FILE_NAME ) ;
  73. //2为取消/启动屏幕指取翻译
  74. m_bCtrl[2] =GetPrivateProfileInt( "热键参数" ,
  75. "热键3的Ctrl值" , 1 , INI_FILE_NAME ) ;
  76. m_bAlt[2] =GetPrivateProfileInt( "热键参数" ,
  77. "热键3的Alt值" , 1 , INI_FILE_NAME ) ;
  78. m_bShift[2] =GetPrivateProfileInt( "热键参数" ,
  79. "热键3的Shift值" , 0 , INI_FILE_NAME ) ;
  80. m_nChar[2] =GetPrivateProfileInt( "热键参数" ,
  81. "热键3的Char值" , 51 , INI_FILE_NAME ) ;
  82. //3为屏幕指取辅助键
  83. m_bCtrl[3] =GetPrivateProfileInt( "热键参数" ,
  84. "热键4的Ctrl值" , 1 , INI_FILE_NAME ) ;
  85. m_bAlt[3] =GetPrivateProfileInt( "热键参数" ,
  86. "热键4的Alt值" , 1 , INI_FILE_NAME ) ;
  87. m_bShift[3] =GetPrivateProfileInt( "热键参数" ,
  88. "热键4的Shift值" , 0 , INI_FILE_NAME ) ;
  89. m_nChar[3] =GetPrivateProfileInt( "热键参数" ,
  90. "热键4的Char值" , 0 , INI_FILE_NAME ) ;
  91. //4输入法向后翻页
  92. m_bCtrl[4] =GetPrivateProfileInt( "热键参数" ,
  93. "热键5的Ctrl值" , 0 , INI_FILE_NAME ) ;
  94. m_bAlt[4] =GetPrivateProfileInt( "热键参数" ,
  95. "热键5的Alt值" , 0 , INI_FILE_NAME ) ;
  96. m_bShift[4] =GetPrivateProfileInt( "热键参数" ,
  97. "热键5的Shift值" , 0 , INI_FILE_NAME ) ;
  98. m_nChar[4] =GetPrivateProfileInt( "热键参数" ,
  99. "热键5的Char值" , 54 , INI_FILE_NAME ) ;
  100. //5输入法向前翻页
  101. m_bCtrl[5] =GetPrivateProfileInt( "热键参数" ,
  102. "热键6的Ctrl值" , 0 , INI_FILE_NAME ) ;
  103. m_bAlt[5] =GetPrivateProfileInt( "热键参数" ,
  104. "热键6的Alt值" , 0 , INI_FILE_NAME ) ;
  105. m_bShift[5] =GetPrivateProfileInt( "热键参数" ,
  106. "热键6的Shift值" , 0 , INI_FILE_NAME ) ;
  107. m_nChar[5] =GetPrivateProfileInt( "热键参数" ,
  108. "热键6的Char值" , 53 , INI_FILE_NAME ) ;
  109. }
  110. CHotKeyParam::~CHotKeyParam( void )
  111. {
  112. if( m_hHookHandle )
  113. HookOffHotKey() ;
  114. }
  115. void CHotKeyParam::SetEnableFlag( int n , BOOL b )
  116. {
  117. if( n<0 || n>=m_nHotKeyNum )
  118. return ;
  119. m_bEnable[n] =b ;
  120. }
  121. CGetMessageParam::CGetMessageParam( void )
  122. {
  123. m_hHookHandle =NULL ;
  124. m_hFocusWnd =NULL ;
  125. }
  126. CGetMessageParam::~CGetMessageParam( void )
  127. {
  128. if( m_hHookHandle )
  129. HookOffGetMessage() ;
  130. }
  131. //--------------------------------------------------------------------//
  132. //虚拟键值
  133. static const WPARAM wVkList[MAX_CHAR_NUM] ={
  134. 0 , //没有
  135. VK_ESCAPE ,
  136. VK_F1 ,
  137. VK_F2 ,
  138. VK_F3 ,
  139. VK_F4 ,
  140. VK_F5 ,
  141. VK_F6 , 
  142. VK_F7 ,
  143. VK_F8 ,
  144. VK_F9 ,
  145. VK_F10 ,
  146. VK_F11 ,
  147. VK_F12 ,
  148. VK_SNAPSHOT ,
  149. VK_PAUSE ,
  150. VK_0,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9 ,
  151. VK_A,VK_B,VK_C,VK_D,VK_E,VK_F,VK_G,VK_H,VK_I,VK_J,
  152. VK_K,VK_L,VK_M,VK_N,VK_O,VK_P,VK_Q,VK_R,VK_S,VK_T,
  153. VK_U,VK_V,VK_W,VK_X,VK_Y,VK_Z , //大写字母
  154. 192 , //`
  155. 189  ,  //-
  156. 187 ,  //=
  157. VK_BACK ,
  158. VK_TAB ,
  159. 219 , //[
  160. 221 , //]
  161. 220 , //  ,
  162. 186 , //;
  163. 222 ,  //'
  164. VK_RETURN ,
  165. 188 ,  //,
  166. 190 , //.
  167. 191 , //  /
  168. VK_SPACE ,
  169. VK_INSERT ,
  170. VK_DELETE ,
  171. VK_HOME ,        
  172. VK_END ,
  173. VK_PRIOR ,
  174. VK_NEXT ,
  175. VK_LEFT ,
  176. VK_RIGHT ,
  177. VK_UP ,
  178. VK_DOWN
  179. } ;
  180. //西文、中文标点对应表,0为奇次按键所对应的中文标点,
  181. //1为偶次按键所对应的中文标点
  182. static const BYTE p_bEnChSymbols0[MAX_SYMBOL_NUM] [3]={
  183. "!" , //!
  184. "“" , //"
  185. "#" , //#
  186. "$" ,  //$
  187. "%" ,  //%
  188. "§" ,  //&
  189. "‘" ,  //'
  190. "(" ,  //(
  191. "〔" ,  //)
  192. "×" ,  //*
  193. "+" ,  //+
  194. "," ,  //,
  195. "-" , //-
  196. "。" ,  //.
  197. "、" , // /,
  198. "0","1","2","3","4","5","6","7","8","9",
  199. ":" ,  //:
  200. ";" ,  //;
  201. "「" ,  //<
  202. "=" ,  //=
  203. "『" ,  //>
  204. "?" ,  //?
  205. "℃" ,  //@
  206. "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
  207. "P","Q","R","S","T","U","V","W","X","Y","Z",
  208. "〖" ,  //[
  209. "÷" , //  ,
  210. "【" ,  //]
  211. "¥" ,  //^
  212. "…" ,  //_
  213. "·" ,  //`
  214. "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o",
  215. "p","q","r","s","t","u","v","w","x","y","z",
  216. "《" , //{
  217. "※" ,  //|
  218. "〈" , //}
  219. "~" } ;
  220. static const BYTE p_bEnChSymbols1[MAX_SYMBOL_NUM] [3]={
  221. "!" , //!
  222. "”" , //"
  223. "#" , //#
  224. "$" ,  //$
  225. "%" ,  //%
  226. "§" ,  //&
  227. "’" ,  //'
  228. ")" ,  //(
  229. "〕" ,  //)
  230. "×" ,  //*
  231. "+" ,  //+
  232. "," ,  //,
  233. "-" , //-
  234. "。" ,  //.
  235. "、" ,  // /,
  236. "0","1","2","3","4","5","6","7","8","9",
  237. ":" ,  //:
  238. ";" ,  //;
  239. "」" ,  //<
  240. "=" ,  //=
  241. "』" ,  //>
  242. "?" ,  //?
  243. "℃" ,  //@
  244. "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
  245. "P","Q","R","S","T","U","V","W","X","Y","Z",
  246. "〗" ,  //[
  247. "÷" , //  ,
  248. "】" ,  //]
  249. "¥" ,  //^
  250. "…" ,  //_
  251. "·" ,  //`
  252. "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o",
  253. "p","q","r","s","t","u","v","w","x","y","z",
  254. "》" , //{
  255. "※" ,  //|
  256. "〉" , //}
  257. "~" } ;
  258. //标记某键是奇次还是偶次按钮,0为偶,1为奇,初始为0
  259. static BYTE p_bOddOrEven[MAX_SYMBOL_NUM] ;
  260. //接口函数
  261. #ifdef __cplusplus
  262. extern "C" {
  263. #endif
  264. //挂上所有钩子
  265. BOOL __export FAR PASCAL HookOnAllHooks( void )
  266. {
  267. if( !HookOnHotKey() )
  268. return 0 ;
  269. if( !HookOnGetMessage() )
  270. {
  271. HookOffHotKey() ;
  272. return 0 ;
  273. }
  274. return 1 ;
  275. }
  276. //摘掉所有钩子
  277. void __export FAR PASCAL HookOffAllHooks( void )
  278. {
  279. HookOffHotKey() ;
  280. HookOffGetMessage() ;
  281. }
  282. //--------------------------------------------------------------//
  283. //设置热键值
  284. void __export FAR PASCAL SetHotKeyParams( 
  285. int n , BOOL bCtrl , BOOL bAlt , BOOL bShift , int nChar )
  286. {
  287. if( n<0 || n>=OHotKeyParam.m_nHotKeyNum ) //n不合法
  288. return ;
  289. OHotKeyParam.m_bCtrl[n] =bCtrl ;
  290. OHotKeyParam.m_bAlt[n] =bAlt ;
  291. OHotKeyParam.m_bShift[n] =bShift ;
  292. OHotKeyParam.m_nChar[n] =nChar ;
  293. }
  294. //挂上热键钩子
  295. BOOL __export FAR PASCAL HookOnHotKey( void )
  296. {
  297. OHotKeyParam.m_hHookHandle =SetWindowsHookEx( 
  298. WH_KEYBOARD , HotKeyProc , hCsPublic , NULL ) ;
  299. if( OHotKeyParam.m_hHookHandle )
  300. return 1 ;
  301. return 0 ;
  302. }
  303. //摘掉热键钩子
  304. void __export FAR PASCAL HookOffHotKey( void )
  305. {
  306. if( OHotKeyParam.m_hHookHandle )
  307. {
  308. UnhookWindowsHookEx( OHotKeyParam.m_hHookHandle ) ;
  309. OHotKeyParam.m_hHookHandle =0 ;
  310. }
  311. }
  312. //热键钩子函数
  313. //#define __MYDEBUG
  314. #ifdef __MYDEBUG
  315. int nnn=0 ;
  316. char sBuff[100] ;
  317. #endif
  318. LRESULT __export CALLBACK HotKeyProc(
  319. int code , /* process-message flag */
  320. WPARAM wParam , /* virtual-key code */
  321. LPARAM lParam ) /* keyboard-message information */
  322. {
  323. if( code < 0 || wParam<0 || wParam>=MAX_KEYS_NUM )
  324. return CallNextHookEx( OHotKeyParam.m_hHookHandle ,
  325. code , wParam , lParam ) ;
  326. //处理热键
  327. //判断键是松开还是按下
  328. #ifdef __MYDEBUG
  329. wsprintf( sBuff , "%d:wParam=%d" , nnn++ , wParam ) ;
  330. #endif
  331. if( !(lParam&0x80000000) ) //0为按下
  332. {
  333. #ifdef __MYDEBUG
  334. WritePrivateProfileString( "test" , sBuff , "down" , "test.ini" ) ;
  335. #endif
  336. OHotKeyParam.m_bKeysStatus[wParam] =0 ; //标记该键已经按下
  337. //判断所有的热键
  338. if( JudgeKeysWhenDown( wParam ) ) //有一个满足要求
  339. return 1 ; //抛弃这条消息
  340.     
  341. //-------------------------------------------------------------------------//
  342. if( GetInputBarStatus() != 1 || //不可以输入中文
  343.   !OHotKeyParam.m_bKeysStatus[VK_CONTROL] ||
  344.     !OHotKeyParam.m_bKeysStatus[VK_MENU] )
  345. {
  346. SetMenuCharFlag( 1 ) ; //标记是按钮消失鼠标
  347. return CallNextHookEx( OHotKeyParam.m_hHookHandle ,
  348. code , wParam , lParam ) ;
  349. }
  350. //处理西文、中文标点
  351. if( !GetInputStatus123(1) ) //是中文标点
  352. {
  353. //转换成ASC码
  354. BYTE n=VKeyToAscii( wParam ,
  355. OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) ;
  356. if( n&&
  357. !( (n>='0'&&n<='9') || (n>='a'&&n<='z') || (n>='A'&&n<='Z') ) )
  358. {
  359. char sBuff[3] ;
  360. n -=0x21 ;
  361. if( p_bOddOrEven[n] ) //偶次
  362. {
  363. p_bOddOrEven[n] =0 ;
  364. strcpy( sBuff , (char*)p_bEnChSymbols1[n] ) ;
  365. }
  366. else //奇次
  367. {
  368. p_bOddOrEven[n] =1 ;
  369. strcpy( sBuff , (char*)p_bEnChSymbols0[n] ) ;
  370. }
  371. switch( GetInputCode() ) //判断输入内码
  372. {
  373. case 1: //BIG5
  374. ChangeGbToBig5( sBuff , strlen( sBuff ) ) ; //转成BIG5码
  375. break ;
  376. case 2: //HZ
  377. ChangeGbToHz( sBuff , strlen( sBuff ) ) ; //转成HZ
  378. break ;
  379. }
  380. if( SendHz( sBuff ) ) //发送汉字成功
  381. return 1 ; //抛弃这条消息
  382. }
  383. }
  384. //处理全角、半角字符
  385. if( !GetInputStatus123(3) ) //是全角字符
  386. {
  387. //转换成ASC码
  388. BYTE n=VKeyToAscii( wParam ,
  389. OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) ;
  390. if( n )
  391. {
  392. char sBuff[3] ={ 0xa3 , 0 , '' } ;
  393. sBuff[1] =n|0x80 ;
  394. switch( GetInputCode() ) //判断输入内码
  395. {
  396. case 1: //BIG5
  397. ChangeGbToBig5( sBuff , strlen( sBuff ) ) ; //转成BIG5码
  398. break ;
  399. case 2: //HZ
  400. ChangeGbToHz( sBuff , strlen( sBuff ) ) ; //转成HZ
  401. break ;
  402. }
  403. if( SendHz( sBuff ) ) //发送汉字成功
  404. return 1 ; //抛弃这条消息
  405. }
  406. }
  407. //处理输入板上字符操作
  408.     if( OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) //没有按下SHIFT键
  409.     {
  410. if( ::SendMessage( GetInputBarHandle() , 
  411. WM_USER_INPUT_CHAR , wParam , lParam ) )
  412. return 1 ; //抛弃这条消息
  413. }
  414. SetMenuCharFlag( 1 ) ; //标记是按钮消失鼠标
  415. }
  416. else //1为松开某键
  417. {
  418. #ifdef __MYDEBUG
  419. WritePrivateProfileString( "test" , sBuff , "up" , "test.ini" ) ;
  420. #endif
  421. HideFinger() ; //松开时,隐藏解释窗口
  422. if( GetFingerAidedKeyFlag()==2 ) //辅助键按下了
  423. SetFingerAidedKeyFlag( 1 ) ; //设置没有按下
  424. //只要松开某键就去掉执行标记
  425. OHotKeyParam.m_nHaveDoneKey =-1 ;
  426. //判断所有的热键
  427. if( JudgeKeysWhenUp( wParam ) ) //有一个满足要求
  428. {
  429. OHotKeyParam.m_bActionOk =0 ; //标记动作无效
  430. OHotKeyParam.m_bKeysStatus[wParam] =1 ; //标记该键没有按下
  431. //判断是否可以取消无效状态
  432. for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
  433. if( !OHotKeyParam.m_bKeysStatus[i] ) //该键是按下的
  434. break ;
  435. if( i==MAX_KEYS_NUM ) //没有按下的键
  436. OHotKeyParam.m_bActionOk =1 ; //标记有效
  437. return 1 ; //抛弃这条消息
  438. }
  439. OHotKeyParam.m_bActionOk =0 ; //标记动作无效
  440. OHotKeyParam.m_bKeysStatus[wParam] =1 ; //标记该键没有按下
  441. //判断是否可以取消无效状态
  442. for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
  443. if( !OHotKeyParam.m_bKeysStatus[i] ) //该键是按下的
  444. break ;
  445. if( i==MAX_KEYS_NUM ) //没有按下的键
  446. OHotKeyParam.m_bActionOk =1 ; //标记有效
  447. }
  448. return CallNextHookEx( OHotKeyParam.m_hHookHandle ,
  449. code , wParam , lParam ) ;
  450. }
  451.    
  452. //将虚拟键转换成ASC码
  453. BYTE __export FAR PASCAL VKeyToAscii( WPARAM wParam , BOOL bShiftStatus )
  454. {
  455. if( bShiftStatus ) //没有按下SHIFT键
  456. {
  457. if( wParam>=VK_0&&wParam<=VK_9 )
  458. return wParam ;
  459. if( wParam>=VK_A && wParam<=VK_Z )
  460. {
  461. if( GetKeyState( VK_CAPITAL )&1 ) //是大写字母
  462. return wParam ;
  463. else
  464. return( wParam-'A'+'a' ) ; //返回小写字母
  465. }
  466. switch( wParam )
  467. {
  468. case 192: //`
  469. return '`' ;
  470. case 189: //-
  471. return '-' ;
  472. case 187:  //=
  473. return '=' ;
  474. case 219: //[
  475. return '[' ;
  476. case 221: //]
  477. return ']' ;
  478. case 220: //  ,
  479. return '\' ;
  480. case 186: //;
  481. return ';' ;
  482. case 222: //'
  483. return ''' ;
  484. case 188:  //,
  485. return ',' ;
  486. case 190: //.
  487. return '.' ;
  488. case 191: //  /
  489. return '/' ;
  490. }
  491. }
  492. else //按下了SHIFT键
  493. {
  494. if( wParam>=VK_A && wParam<=VK_Z )
  495. {
  496. if( GetKeyState( VK_CAPITAL )&1 ) //CAPS LOCK键有效
  497. return( wParam-'A'+'a' ) ; //返回小写字母
  498. else
  499. return wParam ;
  500. }
  501. switch( wParam )
  502. {
  503. case VK_0:
  504. return ')' ;
  505. case VK_1:
  506. return '!' ;
  507. case VK_2:
  508. return '@' ;
  509. case VK_3:
  510. return '#' ;
  511. case VK_4:
  512. return '$' ;
  513. case VK_5:
  514. return '%' ;
  515. case VK_6:
  516. return '^' ;
  517. case VK_7:
  518. return '&' ;
  519. case VK_8:
  520. return '*' ;
  521. case VK_9:
  522. return '(' ;
  523. case 192: //`
  524. return '~' ;
  525. case 189: //-
  526. return '_' ;
  527. case 187:  //=
  528. return '+' ;
  529. case 219: //[
  530. return '{' ;
  531. case 221: //]
  532. return '}' ;
  533. case 220: //  ,
  534. return '|' ;
  535. case 186: //;
  536. return ':' ;
  537. case 222: //'
  538. return '"' ;
  539. case 188:  //,
  540. return '<' ;
  541. case 190: //.
  542. return '>' ;
  543. case 191: //  /
  544. return '?' ;
  545. }
  546. }
  547. return 0 ;
  548. }
  549. //当按下某键时,判断是否有符合条件的热键
  550. BOOL JudgeKeysWhenDown( WPARAM wParam )
  551. {
  552. if( OHotKeyParam.m_nHaveDoneKey >-1 ) //已经执行过动作了
  553. return 0 ; //不再执行了
  554. //判断热键
  555. for( int i=0 ; i<OHotKeyParam.m_nHotKeyNum ; i++ ) //所有热键
  556. {
  557. if( !OHotKeyParam.m_bEnable[i] || //该热键目前无效
  558.      (!OHotKeyParam.m_bCtrl[i] &&
  559.       !OHotKeyParam.m_bAlt[i] &&
  560.       !OHotKeyParam.m_bShift[i] &&
  561.       !OHotKeyParam.m_nChar[i]) ) //该热键没有定义
  562. continue ;
  563. if( OHotKeyParam.m_bCharStatus[i] ) //弹起时有效
  564. {
  565. #ifdef __MYDEBUG
  566. wsprintf( sBuff , "%d:i=%d nChar[i]=%d vk=%d" , nnn , i ,
  567. OHotKeyParam.m_nChar[i],wVkList[OHotKeyParam.m_nChar[i]]) ;
  568. WritePrivateProfileString( "test" , sBuff , "start" , "test.ini" ) ;
  569. #endif
  570. if( OHotKeyParam.m_nChar[i] && //有其它键
  571.   wParam==wVkList[OHotKeyParam.m_nChar[i]] && //是该键
  572.   AllKeysStatusIsOk( i ) ) //所有键状态都正确
  573. {
  574. #ifdef __MYDEBUG
  575. WritePrivateProfileString( "test" , "success" , "ok" , "test.ini" ) ;
  576. #endif
  577. (*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
  578. OHotKeyParam.m_nHaveDoneKey =i ; //做执行过标记
  579. return 1 ; //成功返回
  580. }
  581. continue ; //该热键不符合要求
  582. }
  583. else //按下时有效
  584. {
  585. if( AllKeysStatusIsOk( i ) ) //所有键状态都正确
  586. {
  587. (*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
  588. // OHotKeyParam.m_nHaveDoneKey =i ; //做执行过标记
  589. return 1 ; //成功返回
  590. }
  591. }
  592. }
  593. return 0 ; //没有符合要求的热键
  594. }
  595. //当松开某键时,判断是否有符合条件的热键
  596. BOOL JudgeKeysWhenUp( WPARAM wParam )
  597. {
  598. //判断热键
  599. for( int i=0 ; i<OHotKeyParam.m_nHotKeyNum ; i++ ) //所有热键
  600. {
  601. if( !OHotKeyParam.m_bEnable[i] || //该热键目前无效
  602.      (!OHotKeyParam.m_bCtrl[i] &&
  603.      !OHotKeyParam.m_bAlt[i] &&
  604.      !OHotKeyParam.m_bShift[i] &&
  605.      !OHotKeyParam.m_nChar[i]) ) //该热键没有定义
  606. continue ;
  607. if( OHotKeyParam.m_bCharStatus[i] ) //弹起时有效
  608. {
  609. if( !OHotKeyParam.m_nChar[i] ) //没有其它键
  610. {
  611. //判断是否可能
  612.   if( OHotKeyParam.m_bActionOk && //该动作有效
  613.   AllKeysStatusIsOk( i ) ) //所有键状态都正确
  614. {
  615. (*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
  616. return 1 ; //成功返回
  617. }
  618. }
  619. }
  620. }
  621. return 0 ; //没有符合要求的热键
  622. }
  623. //判断是否所有键的状态都符合要求
  624. BOOL AllKeysStatusIsOk( int n )
  625. {
  626. //所有键的状态都要符合
  627. for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
  628. {
  629. #ifdef __MYDEBUG
  630. wsprintf( sBuff , "%d:i=%d" , nnn , i ) ;
  631. WritePrivateProfileString( "test" , sBuff , "checkkey" , "test.ini" ) ;
  632. #endif
  633. if( i==VK_CONTROL ) //是Ctrl键
  634. {
  635. if( OHotKeyParam.m_bKeysStatus[i]==
  636.       OHotKeyParam.m_bCtrl[n] ) //状态不符
  637. return 0 ;
  638. continue ; //状态相符
  639. }
  640. if( i==VK_MENU ) //是Alt键
  641. {
  642. if( OHotKeyParam.m_bKeysStatus[i]==
  643.   OHotKeyParam.m_bAlt[n] ) //状态不符
  644. return 0 ;
  645. continue ; //状态相符
  646. }
  647. if( i==VK_SHIFT ) //是Shift键
  648. {
  649. if( OHotKeyParam.m_bKeysStatus[i]==
  650.       OHotKeyParam.m_bShift[n] ) //状态不符
  651.     return 0;
  652. continue ; //状态相符
  653. }
  654. if( OHotKeyParam.m_nChar[n] ) //需要其它键
  655. {
  656. if( (WPARAM)i==wVkList[OHotKeyParam.m_nChar[n]] ) //是该键
  657. {
  658. if( OHotKeyParam.m_bKeysStatus[i] ) //该键没有按下
  659. return 0 ;
  660. continue ; //该键按下了
  661. }
  662. }
  663. //不是其中某键者不能按下
  664. if( !OHotKeyParam.m_bKeysStatus[i] ) //按下了
  665. return 0 ;
  666. }
  667. return 1 ; //都符合状态
  668. }
  669. //切换指取翻译
  670. extern "C" void __export FAR PASCAL SwitchFinger( void )
  671. {
  672. if( GetFingerTranslate() ) //当前是可以进行指取翻译的
  673. {
  674. SetFingerTranslate( 0 ) ; //设成不可以
  675. HookFingerOff() ; //卸掉指取模块
  676. if( GetOutputCode()==5 ) //当前不显示汉字
  677. ToEnglish() ; //卸掉汉字系统
  678. OHotKeyParam.m_bEnable[3] =0 ; //辅助键无效
  679. }
  680. else
  681. {
  682. if( GetOutputCode()==5 ) //当前不显示汉字
  683. ToChinese() ; //挂上汉字系统
  684. if( GetFingerAidedKeyFlag() ) //需要辅助键
  685. OHotKeyParam.m_bEnable[3] =1 ; //辅助键有效
  686. SetFingerTranslate( 1 ) ; //设成可以
  687. HookFingerOn() ; //挂上指取模块
  688. StartFingerTranslation() ; //开始指取翻译
  689. }
  690. }
  691. //指取翻译辅助键
  692. void AidFinger( void )
  693. {
  694. SetFingerAidedKeyFlag( 2 ) ; //标记辅助键已经按下
  695. StartFingerTranslation() ; //开始指取翻译
  696. }
  697. //输入法向后翻页
  698. void PageNext( void )
  699. {
  700. ::SendMessage( GetInputBarHandle() , WM_USER_SCROLL_PAGE ,
  701. 3 , 0 ) ;
  702. }
  703. //输入法向前翻页
  704. void PagePrior( void )
  705. {
  706. ::SendMessage( GetInputBarHandle() , WM_USER_SCROLL_PAGE ,
  707. 4 , 0 ) ;
  708. }
  709. //----------------------------------------------------------------------------------//
  710. //WH_GETMESSAGE 钩子函数对象
  711. //挂上WH_GETMESSAGE钩子
  712. BOOL __export FAR PASCAL HookOnGetMessage( void )
  713. {
  714. OGetMessageParam.m_hHookHandle =SetWindowsHookEx( 
  715. WH_GETMESSAGE , GetMessageProc , hCsPublic , NULL ) ;
  716. if( OGetMessageParam.m_hHookHandle )
  717. return 1 ;
  718. return 0 ;
  719. }
  720. //摘掉WH_GETMESSAGE钩子
  721. void __export FAR PASCAL HookOffGetMessage( void )
  722. {
  723. if( OGetMessageParam.m_hHookHandle )
  724. {
  725. UnhookWindowsHookEx( OGetMessageParam.m_hHookHandle ) ;
  726. OGetMessageParam.m_hHookHandle =0 ;
  727. }
  728. }
  729. //得到当前拥有输入焦点的窗口句柄
  730. HWND __export FAR PASCAL GetFocus32( void )
  731. {
  732. return OGetMessageParam.m_hFocusWnd ;
  733. }
  734. //WH_GETMESSAGE钩子函数
  735. LRESULT __export CALLBACK GetMessageProc(
  736. int code , /* process-message flag */
  737. WPARAM wParam , /* undefined */
  738. LPARAM lParam ) /* pointer to MSG structure */
  739. {                           
  740. if( code>=0 )
  741. {
  742.     HWND hActiveWnd = ::GetActiveWindow(); //当前活动窗口
  743. if( ((MSG*)lParam)->hwnd == hActiveWnd ||  //是活动窗口
  744. IsChild( hActiveWnd , ((MSG*)lParam)->hwnd) ) //或是活动窗口的子窗口
  745. {
  746. OGetMessageParam.m_hFocusWnd =::GetFocus() ;
  747. /*       HWND hWnd = ::GetFocus();     // Get Current Focus Window
  748.        if( hWnd )
  749.        OGetMessageParam.m_hFocusWnd =hWnd ;
  750.        else //为空
  751.        {
  752.           if( !IsChild(hActiveWnd, hFocusWnd)) //不是其子窗口 
  753.           hFocusWnd =hWnd;
  754.        }
  755. */
  756.     }
  757.    
  758.     if( ((MSG*)lParam)->message == WM_LBUTTONDBLCLK )
  759.     SetMenuCharFlag( 1 ) ; //标记为同按键消失菜单
  760.     }
  761.    
  762.     return CallNextHookEx( OGetMessageParam.m_hHookHandle, 
  763.     code, wParam, lParam ) ;
  764. }
  765. //设置翻页按钮的有效性,1有效,0无效
  766. void __export FAR PASCAL SetScrollPageKeysStatus( BOOL bLeft ,
  767. BOOL bRight )
  768. {
  769. OHotKeyParam.m_bEnable[4] =bRight ;
  770. OHotKeyParam.m_bEnable[5] =bLeft ;
  771. }
  772. #ifdef __cplusplus
  773. }
  774. #endif