HOOK windows消息 C# 代码
Option Explicit
private [DllImport("GAIS", SetLastError=true)] static extern long CallWindowProc Lib "user32" Alias "CallWindowProcA" ( long lpPrevWndFunc, long Hwnd, long msg, long wParam, long lParam) {
[DllImport("GAIS", SetLastError=true)] static extern long GetProcAddress Lib "kernel32" ( long hModule, string lpProcName) {
[DllImport("GAIS", SetLastError=true)] static extern long LoadLibrary Lib "kernel32" Alias "LoadLibraryA" ( string lpLibFileName) {
private [DllImport("GAIS", SetLastError=true)] static extern long GetWindowText Lib "user32" Alias "GetWindowTextA" ( long Hwnd, string lpString, long cch) {
private [DllImport("GAIS", SetLastError=true)] static extern long RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" ( string lpString) {
private [DllImport("GAIS", SetLastError=true)] static extern long SetWindowLong Lib "user32" Alias "SetWindowLongA" ( long Hwnd, long nIndex, long dwNewLong) {
private [DllImport("GAIS", SetLastError=true)] static extern long GetWindowLong Lib "user32" Alias "GetWindowLongA" ( long Hwnd, long nIndex) {
private [DllImport("GAIS", SetLastError=true)] static extern long RegisterShellHook Lib "Shell32" Alias "#181" ( long Hwnd, long nAction) {
private [DllImport("GAIS", SetLastError=true)] static extern long RegisterShellHookWindow Lib "user32" ( long Hwnd) {
private [DllImport("GAIS", SetLastError=true)] static extern long GetForegroundWindow Lib "user32" () {
private [DllImport("GAIS", SetLastError=true)] static extern long GetWindowThreadProcessId Lib "user32" ( long Hwnd, long lpdwProcessId) {
private [DllImport("GAIS", SetLastError=true)] static extern long OpenProcess Lib "kernel32" ( long dwDesiredAccess, long bInheritHandle, long dwProcessId) {
private [DllImport("GAIS", SetLastError=true)] static extern long EnumProcessModules Lib "psapi.dll" ( long hProcess, ref long lphModule, long cb, ref long lpcbNeeded) {
private [DllImport("GAIS", SetLastError=true)] static extern long GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" ( long hProcess, long hModule, string lpFilename, long nSize) {
private [DllImport("GAIS", SetLastError=true)] static extern void CloseHandle Lib "kernel32" ( long hPass) {
private const PROCESS_QUERY_INFORMATION = 1024
private const PROCESS_VM_READ = 16
private const HSHELL_WINDOWCREATED = 1
private const HSHELL_WINDOWDESTROYED = 2
private const HSHELL_ACTIVATESHELLWINDOW = 3
private const HSHELL_WINDOWACTIVATED = 4
private const HSHELL_GETMINRECT = 5
private const HSHELL_REDRAW = 6
private const HSHELL_TASKMAN = 7
private const HSHELL_LANGUAGE = 8
private const WM_NCDESTROY = &H82
private const GWL_WNDPROC = -4
private const WH_SHELL = 10
private const long WH_CBT = 5;
private const GW_OWNER = 4
private const GWL_EXSTYLE = (-20)
private const WS_EX_TOOLWINDOW = &H80
private const WS_EX_APPWINDOW = &H40000
private const RSH_DEREGISTER = 0
private const RSH_REGISTER = 1
private const RSH_REGISTER_PROGMAN = 2
private const RSH_REGISTER_TASKMAN = 3
private long lpPrevWndProc;
public long msgShellHook;
public void Unhook(long Hwnd) {
//Call RegisterShellHook(Hwnd, RSH_DEREGISTER)
SetWindowLong Hwnd, GWL_WNDPROC, lpPrevWndProc
}
public void StartHook(long Hwnd) {
msgShellHook = RegisterWindowMessage("SHELLHOOK");
long hLibShell;
RegisterShellHookWindow Hwnd;
//Call RegisterShellHook(Hwnd, RSH_REGISTER || RSH_REGISTER_TASKMAN || RSH_REGISTER_PROGMAN)
lpPrevWndProc = SetWindowLong(Hwnd, GWL_WNDPROC, delegate(GAIS) WindowProc);
}
private long WindowProc( long Hwnd, long uMsg, long wParam, long lParam) {
switch (GAIS) { uMsg;
case WM_NCDESTROY;
Unhook Hwnd;
case msgShellHook;
switch (GAIS) { wParam;
case HSHELL_WINDOWCREATED;
AddCREATEDstr lParam;
//case HSHELL_WINDOWDESTROYED
//这里没有用,想用的话,添加你的代码
//case HSHELL_REDRAW
//这里没有用,想用的话,添加你的代码
//case HSHELL_WINDOWACTIVATED
//这里没有用,想用的话,添加你的代码
//case HSHELL_GETMINRECT
//这里没有用,想用的话,添加你的代码
//case HSHELL_REDRAW
//这里没有用,想用的话,添加你的代码
//case HSHELL_TASKMAN
//这里没有用,想用的话,添加你的代码
//case HSHELL_LANGUAGE
//这里没有用,想用的话,添加你的代码
}
}
WindowProc = CallWindowProc(lpPrevWndProc, Hwnd, uMsg, wParam, lParam);
}
private string GetEXEFromHandle(Optional long nHWnd = 0) {
long nProcID;
long nResult;
long nTemp;
lModules(1 ; GAIS <= long 200);
string sFile;
long hProcess //;
if ( nHWnd = 0 ) { nHWnd = GetForegroundWindow()
if ( GetWindowThreadProcessId(nHWnd, nProcID) != 0 ) {
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION || PROCESS_VM_READ, 0, nProcID);
if ( hProcess != 0 ) {
nResult = EnumProcessModules(hProcess, lModules(1), 200, nTemp);
if ( nResult != 0 ) {
sFile = Space$(260);
nResult = GetModuleFileNameEx(hProcess, 0, sFile, Len(sFile));
sFile = LCase$(Left$(sFile, nResult));
GetEXEFromHandle = sFile
}
CloseHandle hProcess;
}
}
}
private string GetWindowCaption( long Hwnd) {
string MyStr;
MyStr = string (256, Chr$(0)) //;
GetWindowText Hwnd, MyStr, 256
MyStr = Left$(MyStr, InStr(MyStr, Chr$(0)) - 1);
GetWindowCaption = MyStr
}
private void AddCREATEDstr( long Hwnd) {
if ( Hwnd = 0 ) { return
string s;
s = Format(Now, "YYYY年MM月DD日 HH:MM:SS");
string mCaption;
mCaption = GetWindowCaption(Hwnd);
string exename;
exename = GetEXEFromHandle(Hwnd);
if ( mCaption != "" && exename != "" ) {
s = s + " 句柄为:" + CStr(Hwnd) + " 的窗口被创建,标题为:" + mCaption + " 对应程序路径为:" + exename;
} else if ( mCaption = "" && exename != "" ) {
s = s + " 句柄为:" + CStr(Hwnd) + " 的窗口被创建,对应程序路径为:" + exename;
} else if ( mCaption != "" && exename = "" ) {
s = s + " 句柄为:" + CStr(Hwnd) + " 的窗口被创建,标题为:" + mCaption;
} else if ( mCaption = "" && exename = "" ) {
s = s + " 句柄为:" + CStr(Hwnd) + " 的窗口被创建";
}
Form1.List1.AddItem s
}
窗体代码:;
Option Explicit
private void Form_Load() {
StartHook this.Hwnd;
}
private void Form_Unload(int Cancel) {
Unhook this.Hwnd;
}
private void Form_Resize() {
List1.Move 0, 0, ScaleWidth, ScaleHeight;
}
private void List1_Click() {
MsgBox List1.Text;
}
用一个叫vb2c#转的,我也不知道对不对,供参考
另外一个例子参考
今晚因为某种用途用到RegisterShellHookWindow ,使用还是比较简单的,功能也不错,详细看下MSDN。把代码贴出来
HWND Hwnd = GetSafeHwnd();
msgShellHook = RegisterWindowMessage("SHELLHOOK");
RegisterShellHookWindow( Hwnd );
lpPrevWndProc = SetWindowLong( Hwnd , GWL_WNDPROC, (LONG)WindowProcxx );
/////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProcxx(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
CHAR szProcessPath[_MAX_PATH] = { 0 };
DWORD dwPid = 0;
#define HSHELL_APPCOMMAND 12
if( uMsg == msgShellHook)
{
switch( wParam )
{
case HSHELL_WINDOWCREATED:
{
GetWindowThreadProcessId( (HWND)lParam ,&dwPid);
if( dwPid != GetCurrentProcessId())
{
GetProcessName( dwPid , szProcessPath, _MAX_PATH );
MessageBoxA(NULL,"窗口创建", szProcessPath, MB_OK);
}
}
break;
case HSHELL_APPCOMMAND:
{
MessageBoxA(NULL,"xx窗口创建", szProcessPath, MB_OK);
}
case HSHELL_REDRAW: //比如TAB也却换
{
MessageBoxA(NULL,"窗口HSHELL_REDRAW", szProcessPath, MB_OK);
}
break;
default:
break;
}
}
return CallWindowProc((WNDPROC)lpPrevWndProc, hwnd, uMsg, wParam, lParam);
}
后注:
RegisterShellHookWindow
就是 NtUserCallHwnd 传入 72号。 这个数其实是个索引。用于索引_apfnSimpleCall
而 _apfnSimpleCall 是一个保存着许多函数指针的一个数据结构。我们可以通过下列的函数来调用_apfnSimpleCall里面的函数。因为这些函数的参数比较少,没有参数,一个参数或者俩个参数,所以下面的函数名号理解。
NtUserCallHwndParam NtUserCallNoParam NtUserCallOneParam NtUserCallTwoParam等
每个接受的INDEX是有限制的。
一些安全软件可能会HOOK NtUserCallOneParam NtUserCallTwoParam之类的。具体看 _apfnSimpleCall里面的指针,看你对哪个感兴趣就HOOK哪个。
或者直接修改 _apfnSimpleCall 里面的指针来达到目的也可以。这样比较隐蔽。
嗯,就看这些,有时间再看下,复习去。
HOOK windows消息 C# 代码的更多相关文章
- Windows GUI代码与Windows消息问题调试利器
Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高 ...
- Notepad2(C语言+Windows消息写的,24592行代码)
C语言+Windows消息写的,24592行代码 http://www.flos-freeware.ch/
- windows消息机制详解(转载)
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...
- windows消息钩子注册底层机制浅析
标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...
- Windows消息拦截技术的应用
Windows消息拦截技术的应用 民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做 ...
- Windows消息拦截技术的应用(作者博客里有许多相关文章)
民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到 ...
- Windows消息大全
最近在写TabControl的用户控件,需要用到sendMessage,已做备份. 引用:http://bbs.aau.cn/forum.php?mod=viewthread&tid=7776 ...
- Windows 消息机制浅析
1. Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...
- Windows消息类型
WM_ Window Message 窗口消息,一般用在SendMessage,PostMessage这样的消息函数中 SM_ Static Message 静态标签消息 SS_ Static Sty ...
随机推荐
- iOS数据库操作流程
SQLite最新的版本是3.0,使用之前应该先导入libsqlite3.0.dylib 1.导入流程 2.iOS中操作数据库的流程 打开数据库 准备SQL数据库 执行SQL数据库 语句完结 关闭数据库 ...
- php 开启缓冲,页面纯静态化
服务器默认不开启php缓冲区 两种方法开启 1.php.ini out_put_buffer = on 2.ob_start(); 页面纯静态化 file_put_contents()写文件 ob_s ...
- 如何使用命令提示符进入mysql
如果mysql安装时的路径不是在C盘,应进入mysql的bin目录中,然后在命令提示符中输入“mysql -u USERNAME -pPASSWORD ” 如果如果mysql安装时的路径是在C盘,直接 ...
- Fluid Shopping Website 开发阶段性总结——第一周
开发目的: 可链接微信公众号,无论是桌面端.移动端完美兼容,给用户提供不逊于原生App的用户体验.作为一个软件,有充分的可扩展性,便于未来增强开发.同时给一些正在尝试做OTO的朋友们提供一个平台,因为 ...
- HDU 1969 Pie(二分法)
My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N ...
- PL/SQL — 函数
函数通常用于返回特定的数据.其实质是一个有名字的PL/SQL块,作为一个schema对象存储于数据库,可以被反复执行.函数通常被作为一个表达式来调用或存储过程的一个参数,具有返回值. 一.建立函数 ...
- Ubuntu启动停止在checking battery state...
Ubuntu在“checking battery state...”处停止了,出现这种现象的原因可能有很多种.笔者遇到的是其中的一种. 情景描述: 笔者此前将Ubuntu的图形启动方式修改为了字符界面 ...
- Windows脚本
最近项目测试比较麻烦,要启动好几个command窗口,手敲之类的有些繁琐,于是研究了一下windows脚本,实现以下功能: 懒人吗,参数意义顺序比较懒得记,所以需要友好参数提示: 根据参数数量决定启动 ...
- <三> SQL 基础
SQL查询的一般形式,以及被逻辑处理的顺序 (8) select (9) distinct (11) <TOP_specification> <select_list> (1) ...
- 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b
如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...