键盘钩子程序

KeyHookLib.dll工程

///
// KeyHookLib.h文件

// 定义函数修饰宏,方便引用本DLL工程的导出函数
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif

// 与主程序通信的消息
#define HM_KEY WM_USER + 101

// 声明要导出的函数
BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,
          DWORD dwThreadId = 0, HWND hWndCaller = NULL);

//

//KeyHookLib.def文件

EXPORTS
   SetKeyHook


SECTIONS
 YCIShared   Read Write Shared


// KeyHookLib.cpp文件

#include <windows.h>

#define KEYHOOKLIB_EXPORTS
#include "KeyHookLib.h"


// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL;  // 保存钩子句柄
#pragma data_seg()


///
//自定义函数ModuleFromAddress通过虚拟内存管理函数VirtualQuery//
//返回指定内地址所处模块的模块句柄。VirtualQuery函数可以取得 //
//调用进程虚拟地址空间中指定内存的状态,并将信息返回到一个   //
//MEMORY_BASIC_INFORMATION结构中                             //
///

HMODULE WINAPI ModuleFromAddress(PVOID pv)
{//一个通过内存地址取得模块句柄的帮助函数
 
 MEMORY_BASIC_INFORMATION mbi;//内存基址信息
 
 if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
 { 
  return (HMODULE)mbi.AllocationBase;
  //返回Allocation函数分配的基地址
 }
 else
 {
  return NULL;
 }
}


// 键盘钩子函数
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        if(nCode < 0 || nCode == HC_NOREMOVE)
        //虚拟键码1<nCode<254
  return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
 
        if(lParam & 0x40000000) // 消息重复就交给下一个hook链
 {
  return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
 }
 
 // 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
        ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);
 
        return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


//
//SetWindowsHookEx(int ikHook         //指定钩子类型            //
//                 HOOKPROC lpfn      //钩子函数地址            //
//                 HINSTANCE hMod     //钩子函数所在的DLL实例句柄/
//                 DWORD dwTreadId    //指定是那个线程安装钩子  //
//
// 安装、卸载钩子的函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
 BOOL bOk;
 g_hWndCaller = hWndCaller;// 将当窗口句柄保存为主窗口句柄
 
 if(bInstall)//bInstall为true时表示安装钩子,否则为卸载钩子
 {
  g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc,
     ModuleFromAddress(KeyHookProc), dwThreadId);
  bOk = (g_hHook != NULL);
 }
 else
 {
  bOk = ::UnhookWindowsHookEx(g_hHook);
  g_hHook = NULL;//  保存钩子句柄
 }
 
 return bOk;
}


//KeyHookApp工程
///
///
// KeyHookApp.h文件

#include <afxwin.h> 


class CMyApp : public CWinApp
{
public:
 BOOL InitInstance();
};

class CMainDialog : public CDialog
{
public:
 CMainDialog(CWnd* pParentWnd = NULL);

protected:
 virtual BOOL OnInitDialog();
 virtual void OnCancel();

 afx_msg long OnHookKey(WPARAM wParam, LPARAM lParam);

 DECLARE_MESSAGE_MAP()
};

///
//KeyHookApp.cpp文件


// KeyHookApp.cpp文件

#include "resource.h"
#include "KeyHookApp.h"
#include "../09KeyHookLib/KeyHookLib.h"

#pragma comment(lib, "09KeyHookLib")

CMyApp theApp;

BOOL CMyApp::InitInstance()
{
 CMainDialog dlg;
 m_pMainWnd = &dlg;
 dlg.DoModal();
 return FALSE;
}

CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAIN, pParentWnd)
{
}

BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_MESSAGE(HM_KEY, OnHookKey)
END_MESSAGE_MAP()

BOOL CMainDialog::OnInitDialog()
{
 CDialog::OnInitDialog();
 SetIcon(theApp.LoadIcon(IDI_MAIN), FALSE);
 ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0,
  0, 0, SWP_NOSIZE|SWP_NOREDRAW|SWP_NOMOVE);

 // 安装钩子
 if(!SetKeyHook(TRUE, 0, m_hWnd))
  MessageBox("安装钩子失败!");

 return TRUE;
}


void CMainDialog::OnCancel()
{
 // 卸载钩子
 SetKeyHook(FALSE);
 CDialog::OnCancel();
 return;
}

long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam)
{
 // 此时参数wParam为用户按键的虚拟键码,
 // lParam参数包含按键的重复次数、扫描码、前一个按键状态等信息
    char szKey[80];
 ::GetKeyNameText(lParam, szKey, 80);
    //检取表示键名的字符串,并将它拷贝到szKey缓冲区中
 CString strItem;
 strItem.Format(" 用户按键:%s /r/n", szKey);
 // 添加到编辑框中
 CString strEdit;
 GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit);
 GetDlgItem(IDC_KEYMSG)->SetWindowText(strItem + strEdit);
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值