⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hooks.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -