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# 代码的更多相关文章

  1. Windows GUI代码与Windows消息问题调试利器

    Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高 ...

  2. Notepad2(C语言+Windows消息写的,24592行代码)

    C语言+Windows消息写的,24592行代码 http://www.flos-freeware.ch/

  3. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  4. windows消息钩子注册底层机制浅析

    标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...

  5. Windows消息拦截技术的应用

    Windows消息拦截技术的应用 民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做 ...

  6. Windows消息拦截技术的应用(作者博客里有许多相关文章)

    民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到 ...

  7. Windows消息大全

    最近在写TabControl的用户控件,需要用到sendMessage,已做备份. 引用:http://bbs.aau.cn/forum.php?mod=viewthread&tid=7776 ...

  8. Windows 消息机制浅析

    1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...

  9. Windows消息类型

    WM_ Window Message 窗口消息,一般用在SendMessage,PostMessage这样的消息函数中 SM_ Static Message 静态标签消息 SS_ Static Sty ...

随机推荐

  1. validate中remote的用法

    jquery中的插件validate主要可以用于表单验证,极大地方便了我们,而validate中的remote方法更是非常的方便.以下介绍它的两个主要用途 1.注册时用于验证用户名是否存在 >& ...

  2. javascript 上传 预览图片 兼容 谷歌 ie

    最近的项目要用到这块,但是在网上找了很多资料,很多都是假的,都不行,最后终于找到一个,还是可以兼容主流的,特分享给大家,可以用 <!DOCTYPE html PUBLIC "-//W3 ...

  3. C#之Attribute(特性)

    本文主要复习下基础知识: 1.C#系统自带的特性: 建立一个控制台项目取名为AttributeTest: 我们添加了一个系统自带的Attribute叫Condition,这个特性表示在程序的DEBUG ...

  4. 解决php json_encode 出现的中文转码、乱码问题

    // 防止json中文转码 function jsonEncodeWithCN($data) { return preg_replace("/\\\u([0-9a-f]{4})/ie&quo ...

  5. 前端内容缓存技术:CSI,SSI,ESI

    一.CSI (Client Side Includes)   含义:通过iframe.javascript.ajax  等方式将另外一个页面的内容动态包含进来. 原理:整个页面依然可以静态化为html ...

  6. TortoiseSVN文件夹及文件图标不显示解决方法 [转]

    由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...

  7. 1-了解Python

    为什么使用python: 软件质量: 可读写.一致性.软件质量 支持软件开发的高级重用机制 提供开发者的效率: 代码只有java或C++的1/5~1/3 无须编译链接,提高了程序原的效率 程序的可移植 ...

  8. Html学习_简易个人网页制作

    应用学到的内容,制作简易个人网页 <!DOCTYPE html> <html> <head> <title>Jane.liu</title> ...

  9. entity framework in mysql

    To start using Entity Framework 6 and Visual Studio 2013 is necessary to install MySQL for Visual St ...

  10. 汇编函数调用中bp和sp是指什么?

    bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址sp是栈顶指针,它每次指向栈顶.每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值.像下面这样:在函数进 ...