wince不是不支持,是间接支持
dll中仅提供实际的钩子函数,安装和卸载钩子都在应用程序中进行
导出钩子实现回调函数:KeyProc
HINSTANCE g_hHookApiDLL = NULL;
HHOOK g_KeyBoardhook = NULL;
#pragma data_seg(".ZTSec")
//HWND g_hWnd = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.ZTSec,RWS")
int log(const char * Content, long Len);
int log(const char * Content, long Len)
{
if(Len <= 0)
return 0;
FILE * fp;
fp = fopen( "//hookce32 log.txt", "ab+" );
if( fp == NULL )
return 0;
if(feof(fp) != 1)
{
if(fseek(fp, 0, SEEK_END) != 0)
return 0;
}
long retLen = fprintf(fp, "%s/r/n/r/n", Content);
fclose(fp);
return 1;
}
/********************************************************
功能:创建键盘响应回调函数
参数:int nCode, WPARAM wParam, LPARAM lParam
备注:该回调函数的参数为固定形式
作者:CHR
时间:-12-2
********************************************************/
LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT*) lParam;
if (nCode == HC_ACTION)
{
if(pkh->vkCode == VK_ESCAPE)
{
const char * notice = "按下Esc";
log(notice, strlen(notice));
return TRUE;
}
//按下回车键
if(pkh->vkCode == VK_RETURN)
{
const char * notice = "按下Enter";
log(notice, strlen(notice));
return TRUE;
}
/// Ctrl+Esc
if((pkh->vkCode==VK_ESCAPE && GetAsyncKeyState(VK_LCONTROL)) ||
(pkh->vkCode==VK_ESCAPE && GetAsyncKeyState(VK_RCONTROL)))
{
const char * notice = "Ctrl+Esc";
log(notice, strlen(notice));
return TRUE;
}
///Alt+TAB
if((pkh->vkCode==VK_TAB && GetAsyncKeyState(VK_LMENU)) ||
(pkh->vkCode==VK_TAB && GetAsyncKeyState(VK_RMENU)))
{
const char * notice = "Alt+TAB";
log(notice, strlen(notice));
SHELLEXECUTEINFO shInfo;
memset(&shInfo, 0, sizeof(SHELLEXECUTEINFO));
shInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shInfo.lpFile = _T("//SD Memory//任务管理.exe"); //你要调用的应用程序
shInfo.lpParameters = NULL;
shInfo.lpDirectory = _T("//SD Memory"); //程序存储的目录
ShellExecuteEx(&shInfo);
return TRUE;
}
///Alt+Esc
if((pkh->vkCode==VK_ESCAPE && GetAsyncKeyState(VK_LMENU)) ||
(pkh->vkCode==VK_ESCAPE && GetAsyncKeyState(VK_RMENU)))
{
const char * notice = "Alt+Esc";
log(notice, strlen(notice));
return TRUE;
}
///Ctrl+Alt+Del
if(pkh->vkCode==VK_DELETE)
{
if((GetAsyncKeyState(VK_LCONTROL) && GetAsyncKeyState(VK_LMENU)) ||
(GetAsyncKeyState(VK_LCONTROL) && GetAsyncKeyState(VK_RMENU)))
{
const char * notice = "Ctrl+Alt+Del 1";
log(notice, strlen(notice));
return TRUE;
}
if((GetAsyncKeyState(VK_RCONTROL) && GetAsyncKeyState(VK_LMENU)) ||
(GetAsyncKeyState(VK_RCONTROL) && GetAsyncKeyState(VK_RMENU)))
{
const char * notice = "Ctrl+Alt+Del 2";
log(notice, strlen(notice));
return TRUE;
}
}
///Start Menu
if(pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)
{
const char * notice = "Start Menu";
log(notice, strlen(notice));
return TRUE;
}
}
return XgdCallNextHookEx(g_KeyBoardhook, nCode, wParam, lParam);
}
键盘钩子的调用如下:
注:身份认证和键盘钩子的调用的一起实现的
由于需要hook掉某些键盘按键,所以在进入对话框输入认证信息前需要先加载钩子,在认证完成以后卸载钩子。
备注:在dll中加载和卸载钩子失败,所以把加载卸载放到应用程序中进行调用。
//加载认证对话框dll
typedef void (*AuthDlgShow)();
HINSTANCE hdll;
AuthDlgShow Authdlg;
hdll = LoadLibrary(L"Authentication.dll");
if(hdll != NULL)
{
Authdlg = (AuthDlgShow)GetProcAddress(hdll,L"AuthDlg");
Authdlg(); //调用DLL显示对话框
}
else
{
DWORD error = GetLastError();
char szString[100];
sprintf(szString, "%u ",error);
log(szString, strlen(szString));
return false;
}
FreeLibrary(hdll);
//获取卸载钩子的函数,卸载钩子
if(g_hcoreDLL)
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hcoreDLL, TEXT("UnhookWindowsHookEx"));//_UnhookWindowsHookEx
UnhookWindowsHookEx(g_hInstalledLLKBDhook);
//释放句柄
if(g_hHookApiDLL != NULL)
FreeLibrary(g_hHookApiDLL);
if(g_hcoreDLL)
FreeLibrary(g_hcoreDLL);