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

📄 hooks.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//全程热键
#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<MAX_KEYS_NUM ; i++ )	//所有键状态为弹起
		m_bKeysStatus[i]	=1 ;

	//从INI文件读取当前热键状态
	//得到当前热键值
	//0为隐藏/显示浮动条热键
	m_bCtrl[0]	=GetPrivateProfileInt( "热键参数" ,
							"热键1的Ctrl值" , 0 , INI_FILE_NAME ) ;
	m_bAlt[0]	=GetPrivateProfileInt( "热键参数" ,
							"热键1的Alt值" , 1 , INI_FILE_NAME ) ;
	m_bShift[0]	=GetPrivateProfileInt( "热键参数" ,
							"热键1的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[0]	=GetPrivateProfileInt( "热键参数" ,
							"热键1的Char值" , 59 , INI_FILE_NAME ) ;
	//1为隐藏/显示输入板
	m_bCtrl[1]	=GetPrivateProfileInt( "热键参数" ,
							"热键2的Ctrl值" , 1 , INI_FILE_NAME ) ;
	m_bAlt[1]	=GetPrivateProfileInt( "热键参数" ,
							"热键2的Alt值" , 0 , INI_FILE_NAME ) ;
	m_bShift[1]	=GetPrivateProfileInt( "热键参数" ,
							"热键2的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[1]	=GetPrivateProfileInt( "热键参数" ,
							"热键2的Char值" , 0 , INI_FILE_NAME ) ;
	//2为取消/启动屏幕指取翻译
	m_bCtrl[2]	=GetPrivateProfileInt( "热键参数" ,
							"热键3的Ctrl值" , 1 , INI_FILE_NAME ) ;
	m_bAlt[2]	=GetPrivateProfileInt( "热键参数" ,
							"热键3的Alt值" , 1 , INI_FILE_NAME ) ;
	m_bShift[2]	=GetPrivateProfileInt( "热键参数" ,
							"热键3的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[2]	=GetPrivateProfileInt( "热键参数" ,
							"热键3的Char值" , 51 , INI_FILE_NAME ) ;
	//3为屏幕指取辅助键
	m_bCtrl[3]	=GetPrivateProfileInt( "热键参数" ,
							"热键4的Ctrl值" , 1 , INI_FILE_NAME ) ;
	m_bAlt[3]	=GetPrivateProfileInt( "热键参数" ,
							"热键4的Alt值" , 1 , INI_FILE_NAME ) ;
	m_bShift[3]	=GetPrivateProfileInt( "热键参数" ,
							"热键4的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[3]	=GetPrivateProfileInt( "热键参数" ,
							"热键4的Char值" , 0 , INI_FILE_NAME ) ;
	//4输入法向后翻页
	m_bCtrl[4]	=GetPrivateProfileInt( "热键参数" ,
							"热键5的Ctrl值" , 0 , INI_FILE_NAME ) ;
	m_bAlt[4]	=GetPrivateProfileInt( "热键参数" ,
							"热键5的Alt值" , 0 , INI_FILE_NAME ) ;
	m_bShift[4]	=GetPrivateProfileInt( "热键参数" ,
							"热键5的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[4]	=GetPrivateProfileInt( "热键参数" ,
							"热键5的Char值" , 54 , INI_FILE_NAME ) ;
	//5输入法向前翻页
	m_bCtrl[5]	=GetPrivateProfileInt( "热键参数" ,
							"热键6的Ctrl值" , 0 , INI_FILE_NAME ) ;
	m_bAlt[5]	=GetPrivateProfileInt( "热键参数" ,
							"热键6的Alt值" , 0 , INI_FILE_NAME ) ;
	m_bShift[5]	=GetPrivateProfileInt( "热键参数" ,
							"热键6的Shift值" , 0 , INI_FILE_NAME ) ;
	m_nChar[5]	=GetPrivateProfileInt( "热键参数" ,
							"热键6的Char值" , 53 , INI_FILE_NAME ) ;
}

CHotKeyParam::~CHotKeyParam( void )
{
	if( m_hHookHandle )
		HookOffHotKey() ;
}

void CHotKeyParam::SetEnableFlag( int n , BOOL b )
{
	if( n<0 || n>=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 ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -