Windows SDK 之 Hook的使用
在使用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的使用的更多相关文章
- [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象.于是自己想找几个来 ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- Kinect for Windows SDK开发学习相关资源
Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...
- 【Windows编程】系列第二篇:Windows SDK创建基本控件
在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...
- Kinect for Windows SDK 1.8的改进及新特性
今年3月, 微软推出了Kinect for Windows SDK 1.7 更新,包括了手势识别 Kinect Interactions 和实时 3D 建模 Kinect Fusion 两项新技术. ...
- ONS C++ Windows SDK 调试方法及注意事项
此文将展示ONS C++ Windows SDK 整个调试过程,笔者直接使用sdk包中的example消息发送示例代码,开发环境为win7, 64位,Visual Studio Professiona ...
- Platform SDK、Windows SDK简介
Platform SDK及Windows SDK是由微软公司出品的一个软件开发包,向在微软的Windows操作系统和.NET框架上开发软件和网站的程序员提供头文件.库文件.示例代码.开发文档和开发工具 ...
- Kinect for Windows SDK开发初体验(一)环境配置
1.开发环境需求 (1).硬件需求 a.需要拥有双核,2.66GHz以上的CPU. b.显卡支持Microsoft DirectX 9.0c; c.2GB的内存 d.Kinect for Window ...
- Windows SDK 实现不规则窗口介绍
不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...
随机推荐
- 解决黑苹果与windows时区不一致
原理就是将windows识别硬件时间为UTC-0而不是现在的UTC+8 下面都是抄来的 注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\T ...
- 【工作记录】c#操作win7注册表
这里讲一 C# 小列子(高手请绕过此地! ), 我们平时都是在xp开发比较多...不过现在很多开发人员也在win7下开发了. 下面是在 LocalMachine 下的 一下注册表操作 ,就不详说了 p ...
- SaundProgressBar
https://github.com/eltld/SaundProgressBar
- 使用Visual Studio创建简单的自己定义Web Part 部件属性
使用Visual Studio创建简单的自己定义Web Part 部件属性 自己定义属性使用额外的选项和设置拓展你的Web part部件.本文主要解说怎样使用Visual Studio创建简单的自己定 ...
- IOS触摸事件和手势识别
IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan: ...
- errno多线程安全(转载)
一.errno的由来 在C编程中,errno是个不可缺少的变量,特别是在网络编程中.如果你没有用过errno,那只能说明你的程序不够健壮.当然,如果你是WIN32平台的GetLastError ...
- 四元数(Quaternion)和旋转
四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...
- 安装apache2.4.10
一:依赖安装:apache依赖于apr,apr-util,pcre,所以需要先安装他,并且需要最新的 apr官网:http://apr.apache.org/download.cgi pcre官网:h ...
- shell 学习笔记
<Linux命令行与shell脚本编程大全>笔记 wkss 其他:http://www.cnblogs.com/pengdonglin137/p/3528303.html 一.基本命令 ...
- nodejs学习第一天
//按照nodejs文档上第一页的例子敲了一遍运行了 迷茫 先这样吧 慢慢来 const http = require('http'); const host = '127.0.0.1'; const ...