读书人

在vs2010下抄写了vc++深入详解的hook代

发布时间: 2012-04-04 16:38:51 作者: rapoo

在vs2010下抄写了vc++深入详解的hook代码,其中让按F2关闭对话框,可在我这里为什么按f2没反应呢??

C/C++ code
// InnerHookDlg.cpp : 实现文件//#include "stdafx.h"#include "InnerHook.h"#include "InnerHookDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:    CAboutDlg();// 对话框数据    enum { IDD = IDD_ABOUTBOX };    protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现protected:    DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){    CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CInnerHookDlg 对话框CInnerHookDlg::CInnerHookDlg(CWnd* pParent /*=NULL*/)    : CDialogEx(CInnerHookDlg::IDD, pParent){    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CInnerHookDlg::DoDataExchange(CDataExchange* pDX){    CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CInnerHookDlg, CDialogEx)    ON_WM_SYSCOMMAND()    ON_WM_PAINT()    ON_WM_QUERYDRAGICON()END_MESSAGE_MAP()// CInnerHookDlg 消息处理程序HWND g_hWnd = NULL;HHOOK g_hMouse = NULL;LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam){    return 1;}/***********************具体代码************************/HHOOK g_hKeyboard = NULL;LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam){    //return 1;//    if(VK_SPACE == wParam || VK_RETURN == wParam)    //if(VK_F4 == wParam && lParam>>29&1)    //    return 1;    //else    //    return CallNextHookEx(g_hKeyboard,code,wParam,lParam);    if(VK_F2 == wParam)    {        ::SendMessage(g_hWnd,WM_CLOSE,0,0);        UnhookWindowsHookEx(g_hKeyboard);        UnhookWindowsHookEx(g_hMouse);    }    return 1;}/**********************************************************/BOOL CInnerHookDlg::OnInitDialog(){    CDialogEx::OnInitDialog();    // 将“关于...”菜单项添加到系统菜单中。    // IDM_ABOUTBOX 必须在系统命令范围内。    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);    ASSERT(IDM_ABOUTBOX < 0xF000);    CMenu* pSysMenu = GetSystemMenu(FALSE);    if (pSysMenu != NULL)    {        BOOL bNameValid;        CString strAboutMenu;        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);        ASSERT(bNameValid);        if (!strAboutMenu.IsEmpty())        {            pSysMenu->AppendMenu(MF_SEPARATOR);            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);        }    }    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动    //  执行此操作    SetIcon(m_hIcon, TRUE);            // 设置大图标    SetIcon(m_hIcon, FALSE);        // 设置小图标    // TODO: 在此添加额外的初始化代码/***********************具体代码************************/        g_hWnd == m_hWnd;    g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());    g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());/******************************************************/    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void CInnerHookDlg::OnSysCommand(UINT nID, LPARAM lParam){    if ((nID & 0xFFF0) == IDM_ABOUTBOX)    {        CAboutDlg dlgAbout;        dlgAbout.DoModal();    }    else    {        CDialogEx::OnSysCommand(nID, lParam);    }}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void CInnerHookDlg::OnPaint(){    if (IsIconic())    {        CPaintDC dc(this); // 用于绘制的设备上下文        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);        // 使图标在工作区矩形中居中        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;        // 绘制图标        dc.DrawIcon(x, y, m_hIcon);    }    else    {        CDialogEx::OnPaint();    }}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CInnerHookDlg::OnQueryDragIcon(){    return static_cast<HCURSOR>(m_hIcon);}


[解决办法]
/***********************具体代码************************/
g_hWnd == m_hWnd;

您老先生看清楚了,这出的问题

读书人网 >VC/MFC

热点推荐