📄 hooks.cpp
字号:
switch( GetInputCode() ) //判断输入内码
{
case 1: //BIG5
ChangeGbToBig5( sBuff , strlen( sBuff ) ) ; //转成BIG5码
break ;
case 2: //HZ
ChangeGbToHz( sBuff , strlen( sBuff ) ) ; //转成HZ
break ;
}
if( SendHz( sBuff ) ) //发送汉字成功
return 1 ; //抛弃这条消息
}
}
//处理输入板上字符操作
if( OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) //没有按下SHIFT键
{
if( ::SendMessage( GetInputBarHandle() ,
WM_USER_INPUT_CHAR , wParam , lParam ) )
return 1 ; //抛弃这条消息
}
SetMenuCharFlag( 1 ) ; //标记是按钮消失鼠标
}
else //1为松开某键
{
#ifdef __MYDEBUG
WritePrivateProfileString( "test" , sBuff , "up" , "test.ini" ) ;
#endif
HideFinger() ; //松开时,隐藏解释窗口
if( GetFingerAidedKeyFlag()==2 ) //辅助键按下了
SetFingerAidedKeyFlag( 1 ) ; //设置没有按下
//只要松开某键就去掉执行标记
OHotKeyParam.m_nHaveDoneKey =-1 ;
//判断所有的热键
if( JudgeKeysWhenUp( wParam ) ) //有一个满足要求
{
OHotKeyParam.m_bActionOk =0 ; //标记动作无效
OHotKeyParam.m_bKeysStatus[wParam] =1 ; //标记该键没有按下
//判断是否可以取消无效状态
for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
if( !OHotKeyParam.m_bKeysStatus[i] ) //该键是按下的
break ;
if( i==MAX_KEYS_NUM ) //没有按下的键
OHotKeyParam.m_bActionOk =1 ; //标记有效
return 1 ; //抛弃这条消息
}
OHotKeyParam.m_bActionOk =0 ; //标记动作无效
OHotKeyParam.m_bKeysStatus[wParam] =1 ; //标记该键没有按下
//判断是否可以取消无效状态
for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
if( !OHotKeyParam.m_bKeysStatus[i] ) //该键是按下的
break ;
if( i==MAX_KEYS_NUM ) //没有按下的键
OHotKeyParam.m_bActionOk =1 ; //标记有效
}
return CallNextHookEx( OHotKeyParam.m_hHookHandle ,
code , wParam , lParam ) ;
}
//将虚拟键转换成ASC码
BYTE __export FAR PASCAL VKeyToAscii( WPARAM wParam , BOOL bShiftStatus )
{
if( bShiftStatus ) //没有按下SHIFT键
{
if( wParam>=VK_0&&wParam<=VK_9 )
return wParam ;
if( wParam>=VK_A && wParam<=VK_Z )
{
if( GetKeyState( VK_CAPITAL )&1 ) //是大写字母
return wParam ;
else
return( wParam-'A'+'a' ) ; //返回小写字母
}
switch( wParam )
{
case 192: //`
return '`' ;
case 189: //-
return '-' ;
case 187: //=
return '=' ;
case 219: //[
return '[' ;
case 221: //]
return ']' ;
case 220: // \ ,
return '\\' ;
case 186: //;
return ';' ;
case 222: //'
return '\'' ;
case 188: //,
return ',' ;
case 190: //.
return '.' ;
case 191: // /
return '/' ;
}
}
else //按下了SHIFT键
{
if( wParam>=VK_A && wParam<=VK_Z )
{
if( GetKeyState( VK_CAPITAL )&1 ) //CAPS LOCK键有效
return( wParam-'A'+'a' ) ; //返回小写字母
else
return wParam ;
}
switch( wParam )
{
case VK_0:
return ')' ;
case VK_1:
return '!' ;
case VK_2:
return '@' ;
case VK_3:
return '#' ;
case VK_4:
return '$' ;
case VK_5:
return '%' ;
case VK_6:
return '^' ;
case VK_7:
return '&' ;
case VK_8:
return '*' ;
case VK_9:
return '(' ;
case 192: //`
return '~' ;
case 189: //-
return '_' ;
case 187: //=
return '+' ;
case 219: //[
return '{' ;
case 221: //]
return '}' ;
case 220: // \ ,
return '|' ;
case 186: //;
return ':' ;
case 222: //'
return '"' ;
case 188: //,
return '<' ;
case 190: //.
return '>' ;
case 191: // /
return '?' ;
}
}
return 0 ;
}
//当按下某键时,判断是否有符合条件的热键
BOOL JudgeKeysWhenDown( WPARAM wParam )
{
if( OHotKeyParam.m_nHaveDoneKey >-1 ) //已经执行过动作了
return 0 ; //不再执行了
//判断热键
for( int i=0 ; i<OHotKeyParam.m_nHotKeyNum ; i++ ) //所有热键
{
if( !OHotKeyParam.m_bEnable[i] || //该热键目前无效
(!OHotKeyParam.m_bCtrl[i] &&
!OHotKeyParam.m_bAlt[i] &&
!OHotKeyParam.m_bShift[i] &&
!OHotKeyParam.m_nChar[i]) ) //该热键没有定义
continue ;
if( OHotKeyParam.m_bCharStatus[i] ) //弹起时有效
{
#ifdef __MYDEBUG
wsprintf( sBuff , "%d:i=%d nChar[i]=%d vk=%d" , nnn , i ,
OHotKeyParam.m_nChar[i],wVkList[OHotKeyParam.m_nChar[i]]) ;
WritePrivateProfileString( "test" , sBuff , "start" , "test.ini" ) ;
#endif
if( OHotKeyParam.m_nChar[i] && //有其它键
wParam==wVkList[OHotKeyParam.m_nChar[i]] && //是该键
AllKeysStatusIsOk( i ) ) //所有键状态都正确
{
#ifdef __MYDEBUG
WritePrivateProfileString( "test" , "success" , "ok" , "test.ini" ) ;
#endif
(*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
OHotKeyParam.m_nHaveDoneKey =i ; //做执行过标记
return 1 ; //成功返回
}
continue ; //该热键不符合要求
}
else //按下时有效
{
if( AllKeysStatusIsOk( i ) ) //所有键状态都正确
{
(*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
// OHotKeyParam.m_nHaveDoneKey =i ; //做执行过标记
return 1 ; //成功返回
}
}
}
return 0 ; //没有符合要求的热键
}
//当松开某键时,判断是否有符合条件的热键
BOOL JudgeKeysWhenUp( WPARAM wParam )
{
//判断热键
for( int i=0 ; i<OHotKeyParam.m_nHotKeyNum ; i++ ) //所有热键
{
if( !OHotKeyParam.m_bEnable[i] || //该热键目前无效
(!OHotKeyParam.m_bCtrl[i] &&
!OHotKeyParam.m_bAlt[i] &&
!OHotKeyParam.m_bShift[i] &&
!OHotKeyParam.m_nChar[i]) ) //该热键没有定义
continue ;
if( OHotKeyParam.m_bCharStatus[i] ) //弹起时有效
{
if( !OHotKeyParam.m_nChar[i] ) //没有其它键
{
//判断是否可能
if( OHotKeyParam.m_bActionOk && //该动作有效
AllKeysStatusIsOk( i ) ) //所有键状态都正确
{
(*OHotKeyParam.m_fpFunc[i])() ; //执行该函数
return 1 ; //成功返回
}
}
}
}
return 0 ; //没有符合要求的热键
}
//判断是否所有键的状态都符合要求
BOOL AllKeysStatusIsOk( int n )
{
//所有键的状态都要符合
for( int i=0 ; i<MAX_KEYS_NUM ; i++ )
{
#ifdef __MYDEBUG
wsprintf( sBuff , "%d:i=%d" , nnn , i ) ;
WritePrivateProfileString( "test" , sBuff , "checkkey" , "test.ini" ) ;
#endif
if( i==VK_CONTROL ) //是Ctrl键
{
if( OHotKeyParam.m_bKeysStatus[i]==
OHotKeyParam.m_bCtrl[n] ) //状态不符
return 0 ;
continue ; //状态相符
}
if( i==VK_MENU ) //是Alt键
{
if( OHotKeyParam.m_bKeysStatus[i]==
OHotKeyParam.m_bAlt[n] ) //状态不符
return 0 ;
continue ; //状态相符
}
if( i==VK_SHIFT ) //是Shift键
{
if( OHotKeyParam.m_bKeysStatus[i]==
OHotKeyParam.m_bShift[n] ) //状态不符
return 0;
continue ; //状态相符
}
if( OHotKeyParam.m_nChar[n] ) //需要其它键
{
if( (WPARAM)i==wVkList[OHotKeyParam.m_nChar[n]] ) //是该键
{
if( OHotKeyParam.m_bKeysStatus[i] ) //该键没有按下
return 0 ;
continue ; //该键按下了
}
}
//不是其中某键者不能按下
if( !OHotKeyParam.m_bKeysStatus[i] ) //按下了
return 0 ;
}
return 1 ; //都符合状态
}
//切换指取翻译
extern "C" void __export FAR PASCAL SwitchFinger( void )
{
if( GetFingerTranslate() ) //当前是可以进行指取翻译的
{
SetFingerTranslate( 0 ) ; //设成不可以
HookFingerOff() ; //卸掉指取模块
if( GetOutputCode()==5 ) //当前不显示汉字
ToEnglish() ; //卸掉汉字系统
OHotKeyParam.m_bEnable[3] =0 ; //辅助键无效
}
else
{
if( GetOutputCode()==5 ) //当前不显示汉字
ToChinese() ; //挂上汉字系统
if( GetFingerAidedKeyFlag() ) //需要辅助键
OHotKeyParam.m_bEnable[3] =1 ; //辅助键有效
SetFingerTranslate( 1 ) ; //设成可以
HookFingerOn() ; //挂上指取模块
StartFingerTranslation() ; //开始指取翻译
}
}
//指取翻译辅助键
void AidFinger( void )
{
SetFingerAidedKeyFlag( 2 ) ; //标记辅助键已经按下
StartFingerTranslation() ; //开始指取翻译
}
//输入法向后翻页
void PageNext( void )
{
::SendMessage( GetInputBarHandle() , WM_USER_SCROLL_PAGE ,
3 , 0 ) ;
}
//输入法向前翻页
void PagePrior( void )
{
::SendMessage( GetInputBarHandle() , WM_USER_SCROLL_PAGE ,
4 , 0 ) ;
}
//----------------------------------------------------------------------------------//
//WH_GETMESSAGE 钩子函数对象
//挂上WH_GETMESSAGE钩子
BOOL __export FAR PASCAL HookOnGetMessage( void )
{
OGetMessageParam.m_hHookHandle =SetWindowsHookEx(
WH_GETMESSAGE , GetMessageProc , hCsPublic , NULL ) ;
if( OGetMessageParam.m_hHookHandle )
return 1 ;
return 0 ;
}
//摘掉WH_GETMESSAGE钩子
void __export FAR PASCAL HookOffGetMessage( void )
{
if( OGetMessageParam.m_hHookHandle )
{
UnhookWindowsHookEx( OGetMessageParam.m_hHookHandle ) ;
OGetMessageParam.m_hHookHandle =0 ;
}
}
//得到当前拥有输入焦点的窗口句柄
HWND __export FAR PASCAL GetFocus32( void )
{
return OGetMessageParam.m_hFocusWnd ;
}
//WH_GETMESSAGE钩子函数
LRESULT __export CALLBACK GetMessageProc(
int code , /* process-message flag */
WPARAM wParam , /* undefined */
LPARAM lParam ) /* pointer to MSG structure */
{
if( code>=0 )
{
HWND hActiveWnd = ::GetActiveWindow(); //当前活动窗口
if( ((MSG*)lParam)->hwnd == hActiveWnd || //是活动窗口
IsChild( hActiveWnd , ((MSG*)lParam)->hwnd) ) //或是活动窗口的子窗口
{
OGetMessageParam.m_hFocusWnd =::GetFocus() ;
/* HWND hWnd = ::GetFocus(); // Get Current Focus Window
if( hWnd )
OGetMessageParam.m_hFocusWnd =hWnd ;
else //为空
{
if( !IsChild(hActiveWnd, hFocusWnd)) //不是其子窗口
hFocusWnd =hWnd;
}
*/
}
if( ((MSG*)lParam)->message == WM_LBUTTONDBLCLK )
SetMenuCharFlag( 1 ) ; //标记为同按键消失菜单
}
return CallNextHookEx( OGetMessageParam.m_hHookHandle,
code, wParam, lParam ) ;
}
//设置翻页按钮的有效性,1有效,0无效
void __export FAR PASCAL SetScrollPageKeysStatus( BOOL bLeft ,
BOOL bRight )
{
OHotKeyParam.m_bEnable[4] =bRight ;
OHotKeyParam.m_bEnable[5] =bLeft ;
}
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -