在使用SetWindowsHookEx的过程中遇到的问题

函数原型

HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook,
_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD dwThreadId
);

  

WinHook.h

// WinHook.h: interface for the WinHook class.
//
////////////////////////////////////////////////////////////////////// class WinHook
{
public:
WinHook();
BOOL InstallHook(int idHook,HANDLE hInstance,HOOKPROC hookproc,int ThreadID);
BOOL UnHook();
LRESULT CallNextHook(int nCode,WPARAM wParam,LPARAM lParam);
virtual ~WinHook(); private:
HHOOK hHook;
};

  

WinHook.cpp

// WinHook.cpp: implementation of the WinHook class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "WinHook.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// WinHook::WinHook()
{ } BOOL WinHook::InstallHook(int idHook,HANDLE hInstance,HOOKPROC hookproc,int ThreadID){
if(hookproc == NULL)
return NULL;
hHook = SetWindowsHookEx(idHook,hookproc,(HINSTANCE)hInstance,ThreadID);
return hHook != NULL;
} BOOL WinHook::UnHook(){
if(!hHook)
return false;
UnhookWindowsHookEx(hHook);
hHook = NULL;
return true;
} LRESULT WinHook::CallNextHook(int nCode,WPARAM wParam,LPARAM lParam){
return CallNextHookEx(hHook,nCode,wParam,lParam);
} WinHook::~WinHook()
{
if(hHook)
UnhookWindowsHookEx(hHook);
}

  

其中需要注意到的是回调函数 Hook Procedure

回调函数原型如下:

LRESULT MyHookProc(int nCode,
WPARAM wParam,
LPARAM lParam
);

  

根据MSDN里边说的

nCode [in]

Type: int

Specifies whether the hook procedure must process the message. If nCode is HC_ACTION, the hook procedure must process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx.

字面意思就是nCode 如果小于0的话 必须通过调用callNextHookex返回值.

如果nCOde 等于HC_ACTIOIN 的话  我们就可以进行处理代码

但是需要知道Hook的时候的消息代码

下面就到了LParam
lParam [in]

Type: LPARAM

A pointer to a CWPRETSTRUCT structure that contains details about the message.

这里说LPARAM 指向了一个CWPRETSTRUCT 里边就包含了Message 的详细信息

下面看操作代码:

startHook and unHook

extern "C"
__declspec(dllexport)
BOOL InstallHook(){
return wh.InstallHook(WH_CALLWNDPROCRET,hThisDLL,(HOOKPROC)MyHookProc,NULL);
} extern "C"
__declspec(dllexport)
BOOL UnHook(){
return wh.UnHook();
}

  

下面是回调函数的操作代码

LRESULT MyHookProc(int nCode,WPARAM wParam,LPARAM lParam){

	if(nCode < 0)
return wh.CallNextHook(nCode,wParam,lParam);
switch (nCode)
{
case HC_ACTION:{ PCWPRETSTRUCT hook_msg = (PCWPRETSTRUCT)lParam;
if(hook_msg){
if(hook_msg->message == WM_SETFOCUS){
// 得到焦点
isAction = true;
}
else if(hook_msg->message == WM_KILLFOCUS){
// 失去焦点
isAction = false;
InvalidateRect(GetParent(hook_msg->hwnd),NULL,true);
}
else if(hook_msg->message == WM_PAINT){
// 绘制客户区
if(isAction){
HDC dc = GetDC(GetParent(hook_msg->hwnd));
TextOut(dc,0,0,_T("123ABCD"),sizeof(_T("123ABCD")));
ReleaseDC(GetParent(hook_msg->hwnd),dc);
}
}
else if(hook_msg->message == WM_NCPAINT){
// 绘制非客户区
HDC dc = GetWindowDC(GetParent(hook_msg->hwnd));
HICON hIcon = LoadIcon((HINSTANCE)hThisDLL,MAKEINTRESOURCE(IDI_ICON1));
DrawIcon(dc,80,0,hIcon);
UpdateWindow(GetParent(hook_msg->hwnd));
ReleaseDC(GetParent(hook_msg->hwnd),dc);
}
} break;
}
default:
break; }
return wh.CallNextHook(nCode,wParam,lParam);
}

  

												

Windows SDK 之 Hook的使用的更多相关文章

  1. [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析

    本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象.于是自己想找几个来 ...

  2. Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect

    原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...

  3. Kinect for Windows SDK开发学习相关资源

    Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...

  4. 【Windows编程】系列第二篇:Windows SDK创建基本控件

    在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...

  5. Kinect for Windows SDK 1.8的改进及新特性

    今年3月, 微软推出了Kinect for Windows SDK 1.7 更新,包括了手势识别 Kinect Interactions 和实时 3D 建模 Kinect Fusion 两项新技术. ...

  6. ONS C++ Windows SDK 调试方法及注意事项

    此文将展示ONS C++ Windows SDK 整个调试过程,笔者直接使用sdk包中的example消息发送示例代码,开发环境为win7, 64位,Visual Studio Professiona ...

  7. Platform SDK、Windows SDK简介

    Platform SDK及Windows SDK是由微软公司出品的一个软件开发包,向在微软的Windows操作系统和.NET框架上开发软件和网站的程序员提供头文件.库文件.示例代码.开发文档和开发工具 ...

  8. Kinect for Windows SDK开发初体验(一)环境配置

    1.开发环境需求 (1).硬件需求 a.需要拥有双核,2.66GHz以上的CPU. b.显卡支持Microsoft DirectX 9.0c; c.2GB的内存 d.Kinect for Window ...

  9. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...

随机推荐

  1. window.location.href的使用方法

    http://hljqfl.blog.163.com/blog/static/40931580201122210573364/ 在写ASP.Net程序的时候,我们常常遇到跳转页面的问题,我们常常使用R ...

  2. 【M25】将构造方法和非成员方法虚化

    1.所谓虚化,就是根据引用或者指针的真实类型,决定调用哪个方法. 2.构造方法虚化,就是根据引用(或者指针)的真实类型,构造出一个对象,如果指针的真实类型是Base,返回Base*:如果指针的真实类型 ...

  3. VS 统计代码行数

    使用正则表达式 :    ^:b*[^:b#/]+.*$ 简单说明如下: ^:行头 $:行尾 +:一个或多个 *:0个或多个 :b:表示空白,匹配空格或者制表符 # 表示后面是include,/表示注 ...

  4. ios实例开发精品源码文章推荐

    iOS源码:游戏引擎-推箱子游戏 http://www.apkbus.com/android-106392-1-11.html iOS源码:进度条-Colorful ProgressView http ...

  5. Python基础教程之第2章 列表和元组

    D:\>python Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Typ ...

  6. 高效编程之cache命中对于程序性能的影响

    下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别? 首先要明白的是不管是几维数组,他们都 ...

  7. 迷你MVVM框架 avalonjs 0.81发布

    本版本最大的改进是将视图的操作全鄣变成异步.详情如下: 管道符与短路与相混淆的BUG 重构on绑定,省得每次都重复绑定同一个事件回调.虽然addEventListener或attachEvent会忽略 ...

  8. Apache的编译安装error: APR not found. Please read the documentation

    提示configure: error: APR not found. Please read the documentation. 经网上查阅资料才知道这是Apache的关联软件 在apr.apach ...

  9. 3.3html学习笔记之链接

    iframe 元素会创建包含另外一个文档的内联框架 <iframe src=""/> 跳转链接 <a href="#here" target= ...

  10. Unity3D 4.61 实现淡入淡出的场景过渡方法。

    还在学习过程中,如果有大大看到请指点. orz原来官方就有了更好的处理方法的教程,具体查看下面视屏. [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(五) 屏幕渐变效 ...