在使用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. [Jobdu] 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

  2. 64位ubuntu下装32位软件

    本帖最后由 wuy069 于 2013-10-25 12:28 编辑 很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软 ...

  3. 【JavaScript】apply和call的区别在哪?

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  4. Html Agility Pack基础类介绍及运用

    第一篇只对Html Agility Pack做了一个大概的介绍,在接下来的章节会比较深入的介绍Html Agility Pack. Html Agility Pack 源码中的类大概有28个左右,其实 ...

  5. HTML <base> 标签

    定义和用法 <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白. 使用 <base& ...

  6. 深入学习PHP内核

    http://www.php-internals.com/  深入学习PHP内核 http://www.php-internals.com/book/ http://www.kancloud.cn/@ ...

  7. IPC——消息队列

    Linux进程间通信——使用消息队列 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管 ...

  8. Golang学习 - regexp 包

    ------------------------------------------------------------ // 函数 // 判断在 b(s.r)中能否找到 pattern 所匹配的字符 ...

  9. LeetCode24 Swap Nodes in Pairs

    题意: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1-> ...

  10. UML 之 各种视图简介

    统一建模语言(Unified Modeling Language,UML)中各种视图并没有明显的概念区别. 在最上一层,视图被划分为三个视图域:结构,动态行为,模型管理. 结构主要描述了系统中的结构成 ...