单进程机器码hook_Hook编程1:进程内勾子

本文展示了如何在单进程中实现键盘和鼠标钩子,通过SetWindowsHookEx函数设置WH_MOUSE和WH_KEYBOARD钩子,拦截特定按键如F2、F4和空格,实现对用户输入的监控和响应。示例代码使用了C++和MFC库。
摘要由CSDN通过智能技术生成

// InnerHookDlg.cpp : implementation file

//

#include "stdafx.h"

#include "InnerHook.h"

#include "InnerHookDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/

// CInnerHookDlg dialog

CInnerHookDlg::CInnerHookDlg(CWnd* pParent /*=NULL*/)

: CDialog(CInnerHookDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CInnerHookDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CInnerHookDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CInnerHookDlg)

// NOTE: the ClassWizard will add DDX and DDV calls here

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CInnerHookDlg, CDialog)

//{{AFX_MSG_MAP(CInnerHookDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_CHAR()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/

// CInnerHookDlg message handlers

HHOOK g_hMouseHook;

HHOOK g_hKeyHook;

HHOOK g_hKeyHook2;

HWND g_hWnd;

LRESULT CALLBACK MouseProc(

int nCode, // hook code

WPARAM wParam, // message identifier

LPARAM lParam // mouse coordinates

)

{

return 1;

}

LRESULT CALLBACK KeyboardProc2(

int code, // hook code

WPARAM wParam, // virtual-key code

LPARAM lParam // keystroke-message information

)

{

if(VK_F2 == wParam)

{

AfxMessageBox("安下了f2");

return 1;

}

else CallNextHookEx(g_hKeyHook2,code,wParam,lParam);

}

LRESULT CALLBACK KeyboardProc(

int code, // hook code

WPARAM wParam, // virtual-key code

LPARAM lParam // keystroke-message information

)

{

if(wParam == VK_SPACE){

TRACE("空格被阻止\n");

//AfxMessageBox("Key Down");

return 1;

}

else if(wParam == VK_F4 && lParam>>29 & 1)

{

TRACE("alt + f4 pressed");

return 1;

}

else if(wParam == VK_F2)

{

::SendMessage(g_hWnd,WM_CLOSE,0,0);

UnhookWindowsHookEx(g_hKeyHook);

UnhookWindowsHookEx(g_hKeyHook2);

return 1;

}

else

{

TRACE("没有阻止\n");

return CallNextHookEx(g_hKeyHook,code,wParam,lParam);

}

}

BOOL CInnerHookDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE);// Set big icon

SetIcon(m_hIcon, FALSE);// Set small icon

// TODO: Add extra initialization here

//g_hMouseHook = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());

g_hWnd = this->m_hWnd;

g_hKeyHook= SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());

g_hKeyHook2 = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc2,NULL,GetCurrentThreadId());

return TRUE; // return TRUE unless you set the focus to a control

}

void CInnerHookDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CInnerHookDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CInnerHookDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CInnerHookDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

CString str;

str.Format("char:%c,code:%d",nChar,nChar);

MessageBox(str);

CDialog::OnChar(nChar, nRepCnt, nFlags);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值