分享

一个键盘钩子函数(sdk实现)

 guoliyan1 2012-02-05
一个键盘钩子函数(sdk实现)
发布于:软件开发网 来源:互联网 作者:佚名 时间:2009-02-26 00:03


改自“Delphi下深入Windows核心编程”56页HookKey程序。原来的Delphi代码使用DEMO控件来显示键盘输入,采用VC后改用多行编辑EDIT控件来显示。程序的思路是当DLL截获键盘消息后,向主程序发送一条自定义的消息,然后主程序将键盘输入显示在对话框中的编辑控件里。关键是采用共享节保存主程序的窗口句柄,并且在DLL中导出该句柄,这样主程序可以在初始化的时候给该句柄赋值,而DLL获得该句柄后,就可以向主程序窗口发送消息了;另外还有EDIT控件用作显示时,要设为只读属性,防止回显键盘输入;采用向该控件发送EM_REPLACESEL消息来连续显示字符。

代码虽然简单,但是我是在参考了Windows核心编程和罗云彬WIN32汇编教程之后费了不少劲才实现了,汗。编程环境是VC2003,使用了JEFFREY大牛同志推荐的MESSAGECRACKER宏。

Dll部分
//Key.h
//下列ifdef块是创建使从DLL导出更简单的
//宏的标准方法。此DLL中的所有文件都是用命令行上定义的KEY_EXPORTS
//符号编译的。在使用此DLL的
//任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
//KEY_API函数视为是从此DLL导入的,而此DLL则将用此宏定义的
//符号视为是被导出的。
#ifdefKEY_EXPORTS
#defineKEY_APIextern"C"__declspec(dllexport)
#else
#defineKEY_APIextern"C"__declspec(dllimport)
#endif
#defineWM_HooKKEY(WM_USER 1000)

KEY_APIvoidHookOn();
KEY_APIvoidHookOff();
KEY_APIHWNDViewInteger;

//Key.cpp:定义DLL应用程序的入口点。
#include<windows.h>
#include"Key.h"
//#include<stdio.h>
//#defineKEY_EXPORTS

//定义共享数据段
#pragmadata_seg("shared")
HWNDViewInteger=HWND(0);//主程序句柄
#pragmadata_seg()
#pragmacomment(linker,"/section:shared,rws")

HHOOKHookDeTeclado=NULL;//钩子句柄
HINSTANCEhInstDLL=NULL;//DLL句柄
HWNDhWndKey=NULL;//主窗口句柄

//DLL主函数
BOOLWINAPIDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved)
{
if(fdwReason==DLL_PROCESS_ATTACH)
hInstDLL=hinstDLL;
returnTRUE;
}

//钩子过程,监视键盘消息
LRESULTCALLBACKCallBackDelHook(intnCode,WPARAMwParam,LPARAMlParam)
{
if(nCode==HC_ACTION)
hWndKey=ViewInteger;
PostMessage(hWndKey,WM_HooKKEY,wParam,lParam);
returnCallNextHookEx(HookDeTeclado,nCode,wParam,lParam);
}

//
voidHookOn(void)
{
HookDeTeclado=SetWindowsHookEx(WH_KEYBOARD,CallBackDelHook,hInstDLL,0);
//return0;
}

//
voidHookOff(void)
{
UnhookWindowsHookEx(HookDeTeclado);
}

/////////////////////////////////////////////////////////////////////////////////////////////////
主程序部分

//stdafx.h:标准系统包含文件的包含文件,
#pragmaonce
#defineWIN32_LEAN_AND_MEAN//从Windows头中排除极少使用的资料
//Windows头文件:
#include<windows.h>
//C运行时头文件
#include<stdlib.h>
#include<malloc.h>
#include<memory.h>
#include<tchar.h>

//TODO:在此处引用程序要求的附加头文件a
#include<commctrl.h>
#include<windowsx.h>
#definechHANDLE_MSG(hwnd,message,fn) \
case(message):return(SetDlgMsgResult(hwnd,msg, \

HANDLE_##message((hwnd),(wParam),(lParam),(fn))))
//Thismacroevaluatestothenumberofelementsinanarray.
#definechDIMOF(Array)(sizeof(Array)/sizeof(Array[0]))

//TestKeyHook.cpp:定义应用程序的入口点。
//
#include"stdafx.h"
#include"TestKeyHook.h"
#include<stdarg.h>//va_list
//#include<tchar.h>
#include<stdio.h>//_vstprintf
#include"Key\Key.h"
//#pragmacomment(lib,"Key.lib")

//该函数改自Windows核心编程第四章
voidAddText(HWNDhwnd,PCTSTRpszFormat,...){
va_listargList;
va_start(argList,pszFormat);

TCHARsz[20*1024];
//Edit_GetText(hwnd,sz,chDIMOF(sz));
//_vstprintf(_tcschr(sz,0),pszFormat,argList);
_vstprintf(sz,pszFormat,argList);
//Edit_SetText(hwnd,sz);
SendMessage(hwnd,EM_REPLACESEL,0,(LPARAM)sz); 
//SendMessage(hwnd,WM_VSCROLL,SB_BOTTOM,0);
va_end(argList);
}

//此代码模块中包含的函数的前向声明:
BOOLCALLBACKDlg_DlgProc(HWND,UINT,WPARAM,LPARAM);

intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Dlg_DlgProc);
return0;
}

//
// ProcessWM_COMMANDmessageforwindow/dialog:Dlg
//
voidDlg_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
//TODO:Addyourmessageprocessingcodehere...
switch(id){
caseIDCANCEL:
if(HookOff!=NULL)
HookOff();
EndDialog(hwnd,id);
break;
}

}

//
// ProcessWM_INITDIALOGmessageforwindow/dialog:Dlg
//
BOOLDlg_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
MessageBox(hwnd,"1",0,0);
//TODO:Addyourmessageprocessingcodehere...
ViewInteger=hwnd;
HookOn();
return(TRUE);
}

voidDlg_HooKKEY(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)
{
HWNDhEdit=GetDlgItem(hwnd,IDC_EDIT1);
charKeyName[101];
// char*Accion;
GetKeyNameText(lParam,KeyName,100);
if((lParam>>31)&&1==1)
AddText(hEdit,"%s%s\r\n","Keyup",KeyName);
elseif((lParam>>30)&&1==1)
AddText(hEdit,"%s%s\r\n","ReKeyDown",KeyName);
else
AddText(hEdit,"%s%s\r\n","KeyDown",KeyName);
//MessageBox(hwnd,Accion,0,0);
//Edit_SetText(GetDlgItem(hwnd,IDC_EDIT1),(LPSTR)Accion);

}
//
//Dlg DialogProcedure
//
BOOLCALLBACKDlg_DlgProc(HWNDhwndDlg,UINTmsg,WPARAMwParam,LPARAMlParam)
{
switch(msg)
{
chHANDLE_MSG(hwndDlg,WM_INITDIALOG,Dlg_OnInitDialog);
chHANDLE_MSG(hwndDlg,WM_COMMAND,Dlg_OnCommand);
////TODO:Adddialogmessagecrackershere...
caseWM_HooKKEY:
Dlg_HooKKEY(hwndDlg,msg,wParam,lParam);


default:returnFALSE;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
//MicrosoftVisualC generatedresourcescript.

//
#include"resource.h"

#defineAPSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
//GeneratedfromtheTEXTINCLUDE2resource.
//
#defineAPSTUDIO_HIDDEN_SYMBOLS
#include"windows.h"
#undefAPSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undefAPSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
//中文(中华人民共和国)resources

#if!defined(AFX_RESOURCE_DLL)||defined(AFX_TARG_CHS)
#ifdef_WIN32
LANGUAGELANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED
#pragmacode_page(936)
#endif//_WIN32

/////////////////////////////////////////////////////////////////////////////
//
//Icon
//

//IconwithlowestIDvalueplacedfirsttoensureapplicationicon
//remainsconsistentonallsystems.
IDI_TESTKEYHOOK ICON "TestKeyHook.ico"
IDI_SMALL ICON "small.ico"

/////////////////////////////////////////////////////////////////////////////
//
//Accelerator
//

IDC_TESTKEYHOOKACCELERATORS
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END


/////////////////////////////////////////////////////////////////////////////
//
//Dialog
//

IDD_DIALOG1DIALOGEX0,0,267,161
STYLEDS_SETFONT|DS_MODALFRAME|DS_FIXEDSYS|WS_MINIMIZEBOX|
WS_MAXIMIZEBOX|WS_POPUP|WS_CAPTION|WS_SYSMENU
CAPTION"Dialog"
FONT8,"MSShellDlg",400,0,0x1
BEGIN
EDITTEXT IDC_EDIT1,7,7,253,147,ES_MULTILINE|ES_READONLY|
WS_VSCROLL|NOTWS_TABSTOP
END


#ifdefAPSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
//TEXTINCLUDE
//

1TEXTINCLUDE
BEGIN
"resource.h\0"
END

2TEXTINCLUDE
BEGIN
"#defineAPSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include""windows.h""\r\n"
"#undefAPSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0"
END

3TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END

#endif //APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
//DESIGNINFO
//

#ifdefAPSTUDIO_INVOKED
GUIDELINESDESIGNINFO
BEGIN
IDD_DIALOG1,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,260
TOPMARGIN,7
BOTTOMMARGIN,154
END
END
#endif //APSTUDIO_INVOKED

#endif //中文(中华人民共和国)resources
/////////////////////////////////////////////////////////////////////////////

#ifndefAPSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////

//
//GeneratedfromtheTEXTINCLUDE3resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif //notAPSTUDIO_INVOKED


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多