在使用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. 汽车XX网站秒杀抢购代码

    .../////完整抢购代码某网站最近在举办半价秒杀 其实有技巧的 首先可以添加代码 //自动监视回车,直接回车提交document.onkeydown=function(e){var theEven ...

  2. android定位和地图开发实例

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便. 首先介绍一下地图包中的主要类: MapController : 主要控制地图移动,伸缩,以某个GPS坐标 ...

  3. 强连通分量(LRJ训练指南)

    #include <iostream> #include <queue> #include <string> #include <cstdio> #in ...

  4. 销售订单行上行号LINE_SHIPMENT_OPTION_NUMBER

     销售订单行上行号:LINE_SHIPMENT_OPTION_NUMBER 取值: ( 1) Line块的块级触发器POST-QUERY调用: OE_LINE.Post_Query;(来自于库OE ...

  5. Flex博客

    http://blog.csdn.net/xingfeng0501/article/details/7533426

  6. Laravel 5.0 之命令及处理程序

    本文译自 Matt Stauffer 的 系列文章 . 本文中涉及的新功能都是关于 Commands 的,这些特性在 Laravel 旧版本中已经有了,但是在 Laravel 5.0 中变得更加好用了 ...

  7. golang之websocket 源码分析

    下载go的websocket包. 1. 通过google官方的方法, 需要hg来同步代码. 由于墙的原因, 还需要设置代理. 比较麻烦 2. http://gopm.io/ 通过该网站下载, 这是go ...

  8. webrtc学习(一): webrtc开始

    一. 编译webrtc 1. 预先准备 1)  vpn. 用于同步代码. 这里给一个大概的估计吧. windows端包含vs2013 win8sdk wdk chromium源码等等, 总共需要至少8 ...

  9. 使用NuGet加载包,发现加载的dll都是最新版,原来少加了参数[-Version]

    使用NuGet获取AutoMapper 发现无法正确加载包,项目版本是3.5,获取的dll版本较高,查资料发现可以通过 “-Version” 指定加载包版本 http://www.mamicode.c ...

  10. [Oracle] Oracle和SQLServer的数据类型比较

    类型名称 Oracle SQLServer 比较 字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型 VA ...