居然有个程序可以避开键盘HOOK? 如何做到?
以下是标准的键盘HOOK 处理过程,基本可以截获所有的键盘动作,但我发现居然有个程序的键盘消息不能截获,请教大家它是如何做到的?
#include "stdafx.h "
#include "hodll.h "
#include "mmsystem.h "
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma data_seg( ".SHARDAT ")
static HHOOK hkb=NULL;
#pragma data_seg()
HINSTANCE hins;
char szBuf[256];
char *p;
CString msg;
////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CHodllApp, CWinApp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
case 'F ':sndPlaySound(msg+ "sound\\f.wav ",SND_ASYNC);break;
... }
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
BOOL __declspec(dllexport)__stdcall installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return TRUE;
}
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
BOOL CHodllApp::InitInstance ()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hins=AfxGetInstanceHandle();
GetModuleFileName(AfxGetInstanceHandle( ),szBuf,sizeof(szBuf));
p = szBuf;
while(strchr(p, '\\ '))
{
p = strchr(p, '\\ ');
p++;
}
*p = '\0 ';
msg=szBuf;
return TRUE;
}
BOOL CHodllApp::ExitInstance ()
{
return TRUE;
}
CHodllApp::CHodllApp()
{
}
CHodllApp theApp;
[解决办法]
通常是
键盘驱动-> 操作系统-> 程序,加的hook通常在操作系统处理的里面
但QQ 是
键盘驱动-> 程序,不过操作系统,所以常规的办法是不可以的