www.pudn.com > 智能内码识别,支持屏幕取词翻译的程序.zip > HOOKS.CPP


//全程热键 
#include	"stdafx.h" 
#include	"resource.h" 
#include	"systemse.h" 
#include	"cspublic.h" 
#include	"cskernel.h" 
#include	"hooks.h" 
 
extern	HINSTANCE	hCsPublic ;		//标识该DLL 
 
CHotKeyParam	OHotKeyParam ;	//热键参数对象 
static CGetMessageParam	 OGetMessageParam ;		//GETMESSAGE钩子对象 
 
CHotKeyParam::CHotKeyParam( void ) 
{ 
	m_nHotKeyNum	=6 ;		//热键数目 
	//隐藏或显示浮动条 
	m_bCharStatus[0]	=1 ;	//弹起时有效 
	m_fpFunc[0]		=(FARPROC)SwitchMainWin ; 
	m_bEnable[0]	=1 ; 
	//隐藏或显示输入板 
	m_bCharStatus[1]	=1 ; 
	m_fpFunc[1]		=(FARPROC)SwitchInputBar ; 
	if( GetPrivateProfileInt( "输入板参数" , 
		"输入板状态" , 1 , INI_FILE_NAME )==2 )	//禁止中文输入 
		m_bEnable[1]	=0 ; 
	else 
		m_bEnable[1]	=1 ; 
	//取消或启动指取翻译 
	m_bCharStatus[2]	=1 ; 
	m_fpFunc[2]		=(FARPROC)SwitchFinger ; 
	m_bEnable[2]	=1 ; 
	//指取翻译辅助键 
	m_bCharStatus[3]	=0 ; 
	m_fpFunc[3]		=(FARPROC)AidFinger ; 
	if( GetPrivateProfileInt( "指取翻译" , "是否进行指取翻译" , 
		1 , INI_FILE_NAME ) &&	 
	     GetPrivateProfileInt( "指取翻译" , 
		"是否需要辅助键" , 0 , INI_FILE_NAME ) ) 
		m_bEnable[3]	=1 ; 
	else 
		m_bEnable[3]	=0 ; 
	//向后翻页 
	m_bCharStatus[4]	=0 ; 
	m_fpFunc[4]	=(FARPROC)PageNext ; 
	m_bEnable[4]	=0 ; 
	//向前翻页 
	m_bCharStatus[5]	=0 ; 
	m_fpFunc[5]	=(FARPROC)PagePrior ; 
	m_bEnable[5]	=0 ; 
	 
	m_hHookHandle	=NULL ; 
 
	m_bActionOk	=1 ;			//初始动作允许 
	m_nHaveDoneKey	=-1 ;	//初始没有做过动作 
	for( int i=0 ; i=m_nHotKeyNum ) 
		return ; 
	 
	m_bEnable[n]	=b ; 
} 
 
CGetMessageParam::CGetMessageParam( void ) 
{ 
	m_hHookHandle	=NULL ; 
	m_hFocusWnd		=NULL ; 
} 
 
CGetMessageParam::~CGetMessageParam( void )	 
{ 
	if( m_hHookHandle ) 
		HookOffGetMessage() ; 
} 
 
//--------------------------------------------------------------------// 
 
//虚拟键值 
static const WPARAM	wVkList[MAX_CHAR_NUM]	={ 
	0 ,			//没有 
	VK_ESCAPE , 
	VK_F1 , 
	VK_F2 , 
	VK_F3 , 
	VK_F4 , 
	VK_F5 , 
	VK_F6 ,  
	VK_F7 , 
	VK_F8 , 
	VK_F9 , 
	VK_F10 , 
	VK_F11 , 
	VK_F12 , 
	VK_SNAPSHOT , 
	VK_PAUSE , 
	VK_0,VK_1,VK_2,VK_3,VK_4,VK_5,VK_6,VK_7,VK_8,VK_9 , 
	VK_A,VK_B,VK_C,VK_D,VK_E,VK_F,VK_G,VK_H,VK_I,VK_J, 
	VK_K,VK_L,VK_M,VK_N,VK_O,VK_P,VK_Q,VK_R,VK_S,VK_T, 
	VK_U,VK_V,VK_W,VK_X,VK_Y,VK_Z ,	//大写字母 
	192 ,	//` 
	189	 , 		//- 
	187 , 	//= 
	VK_BACK , 
	VK_TAB , 
	219 ,	//[ 
	221 ,	//] 
	220 ,	// \ , 
	186	,	//; 
	222 , 			//' 
	VK_RETURN , 
	188 , 		//, 
	190 ,		//. 
	191 ,		//  / 
	VK_SPACE , 
	VK_INSERT , 
	VK_DELETE , 
	VK_HOME ,         
	VK_END , 
	VK_PRIOR , 
	VK_NEXT , 
	VK_LEFT , 
	VK_RIGHT , 
	VK_UP , 
	VK_DOWN 
} ; 
 
//西文、中文标点对应表,0为奇次按键所对应的中文标点, 
//1为偶次按键所对应的中文标点 
static const BYTE p_bEnChSymbols0[MAX_SYMBOL_NUM] [3]={ 
	"!" ,	//! 
	"“" ,	//" 
	"#" ,	//# 
	"$" , 	//$ 
	"%" , 	//% 
	"§" , 	//& 
	"‘" , 	//' 
	"(" , 	//( 
	"〔" , 	//) 
	"×" , 	//* 
	"+" , 	//+ 
	"," , 	//, 
	"-" ,	//- 
	"。" , 	//. 
	"、" ,	// /, 
	"0","1","2","3","4","5","6","7","8","9", 
	":" , 	//: 
	";" , 	//; 
	"「" , 	//< 
	"=" , 	//= 
	"『" , 	//> 
	"?" , 	//? 
	"℃" , 	//@ 
	"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", 
	"P","Q","R","S","T","U","V","W","X","Y","Z", 
	"〖" , 	//[ 
	"÷" ,	//\  ,		 
	"【" , 	//] 
	"¥" , 	//^ 
	"…" , 	//_ 
	"·" , 	//` 
	"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", 
	"p","q","r","s","t","u","v","w","x","y","z", 
	"《" ,	//{ 
	"※" , 	//| 
	"〈" ,	//} 
	"~" } ; 
static const BYTE p_bEnChSymbols1[MAX_SYMBOL_NUM] [3]={ 
	"!" ,	//! 
	"”" ,	//" 
	"#" ,	//# 
	"$" , 	//$ 
	"%" , 	//% 
	"§" , 	//& 
	"’" , 	//' 
	")" , 	//( 
	"〕" , 	//) 
	"×" , 	//* 
	"+" , 	//+ 
	"," , 	//, 
	"-" ,	//- 
	"。" , 	//. 
	"、" , 	// /, 
	"0","1","2","3","4","5","6","7","8","9", 
	":" , 	//: 
	";" , 	//; 
	"」" , 	//< 
	"=" , 	//= 
	"』" , 	//> 
	"?" , 	//? 
	"℃" , 	//@ 
	"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", 
	"P","Q","R","S","T","U","V","W","X","Y","Z", 
	"〗" , 	//[ 
	"÷" ,	//\  ,		 
	"】" , 	//] 
	"¥" , 	//^ 
	"…" , 	//_ 
	"·" , 	//` 
	"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", 
	"p","q","r","s","t","u","v","w","x","y","z", 
	"》" ,	//{ 
	"※" , 	//| 
	"〉" ,	//} 
	"~" } ; 
//标记某键是奇次还是偶次按钮,0为偶,1为奇,初始为0 
static BYTE p_bOddOrEven[MAX_SYMBOL_NUM] ; 
 
//接口函数 
#ifdef __cplusplus 
extern "C" { 
#endif 
 
//挂上所有钩子 
BOOL __export FAR PASCAL	HookOnAllHooks( void ) 
{ 
	if( !HookOnHotKey() ) 
		return	0 ; 
	if( !HookOnGetMessage() ) 
	{ 
		HookOffHotKey() ; 
		return	0 ; 
	} 
	return	1 ; 
} 
 
//摘掉所有钩子 
void __export FAR PASCAL	HookOffAllHooks( void ) 
{ 
	HookOffHotKey() ; 
	HookOffGetMessage() ; 
} 
 
//--------------------------------------------------------------// 
 
//设置热键值 
void __export FAR PASCAL	SetHotKeyParams(  
	int n , BOOL bCtrl , BOOL bAlt , BOOL bShift , int nChar ) 
{ 
	if( n<0 || n>=OHotKeyParam.m_nHotKeyNum )	//n不合法 
		return ; 
		 
	OHotKeyParam.m_bCtrl[n]		=bCtrl ; 
	OHotKeyParam.m_bAlt[n]		=bAlt ; 
	OHotKeyParam.m_bShift[n]	=bShift ; 
	OHotKeyParam.m_nChar[n]		=nChar ; 
} 
 
//挂上热键钩子 
BOOL __export FAR PASCAL HookOnHotKey( void ) 
{ 
	OHotKeyParam.m_hHookHandle	=SetWindowsHookEx(  
		WH_KEYBOARD , HotKeyProc , hCsPublic , NULL ) ; 
	if( OHotKeyParam.m_hHookHandle ) 
		return	1 ; 
	return	0 ;		 
} 
 
//摘掉热键钩子 
void __export FAR PASCAL HookOffHotKey( void ) 
{ 
	if( OHotKeyParam.m_hHookHandle ) 
	{ 
		UnhookWindowsHookEx( OHotKeyParam.m_hHookHandle ) ; 
		OHotKeyParam.m_hHookHandle	=0 ;	 
	} 
} 
 
//热键钩子函数 
//#define	__MYDEBUG 
#ifdef	__MYDEBUG 
int		nnn=0 ; 
char	sBuff[100] ; 
#endif 
LRESULT __export CALLBACK HotKeyProc( 
	int code ,	/* process-message flag	*/ 
	WPARAM wParam ,	/* virtual-key code	*/ 
	LPARAM lParam )	/* keyboard-message information	*/ 
{ 
	if( code < 0 || wParam<0 || wParam>=MAX_KEYS_NUM ) 
		return	CallNextHookEx( OHotKeyParam.m_hHookHandle , 
						code , wParam , lParam ) ; 
 
	//处理热键 
	//判断键是松开还是按下			 
#ifdef	__MYDEBUG 
wsprintf( sBuff , "%d:wParam=%d" , nnn++ , wParam ) ;	 
#endif 
	if( !(lParam&0x80000000) )	//0为按下 
	{ 
#ifdef	__MYDEBUG 
WritePrivateProfileString( "test" , sBuff , "down" , "test.ini" ) ; 
#endif 
		OHotKeyParam.m_bKeysStatus[wParam]	=0 ;	//标记该键已经按下 
		//判断所有的热键 
		if( JudgeKeysWhenDown( wParam ) )	//有一个满足要求 
				return	1 ;	//抛弃这条消息 
     
//-------------------------------------------------------------------------// 
		if( GetInputBarStatus() != 1 ||	//不可以输入中文 
		 	!OHotKeyParam.m_bKeysStatus[VK_CONTROL] || 
		    !OHotKeyParam.m_bKeysStatus[VK_MENU] ) 
		{ 
			SetMenuCharFlag( 1 ) ;	//标记是按钮消失鼠标 
			return	CallNextHookEx( OHotKeyParam.m_hHookHandle , 
						code , wParam , lParam ) ; 
		} 
						 
		//处理西文、中文标点 
		if( !GetInputStatus123(1) )	//是中文标点 
		{ 
			//转换成ASC码 
			BYTE	n=VKeyToAscii( wParam , 
							OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) ; 
			if( n&&	 
				!( (n>='0'&&n<='9') || (n>='a'&&n<='z') || (n>='A'&&n<='Z') ) ) 
			{ 
				char	sBuff[3] ; 
			 
				n	-=0x21 ; 
				if( p_bOddOrEven[n] )	//偶次 
				{ 
					p_bOddOrEven[n]	=0 ; 
					strcpy( sBuff , (char*)p_bEnChSymbols1[n] ) ; 
				} 
				else	//奇次 
				{ 
					p_bOddOrEven[n]	=1 ; 
					strcpy( sBuff , (char*)p_bEnChSymbols0[n] ) ; 
				} 
				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( !GetInputStatus123(3) )	//是全角字符 
		{ 
			//转换成ASC码 
			BYTE	n=VKeyToAscii( wParam , 
							OHotKeyParam.m_bKeysStatus[VK_SHIFT] ) ; 
			if( n ) 
			{ 
				char	sBuff[3]	={ 0xa3 , 0 , '\0' } ; 
				sBuff[1]	=n|0x80 ; 
				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=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=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