aardio 文档

aardio 范例: API 钩子

//API 钩子
//API 钩子就像插队,大家都插队这世界就乱套了,请不要滥用。

//当前线程 API 钩子
import raw.apiHook; 
var hookMessageBoxW = raw.apiHook(
    "user32.dll",
    "MessageBoxW",
    "int(int,ustring,ustring,int)", 
    function(hwnd,text,caption,flag){
        //可选用 owner.callApi 调用原始的 API 函数。
        owner.callApi(hwnd, text, "API Hook: " + caption, flag)  
        return true;
    }
).install(); 

//调用 API
::User32.MessageBox(0,"内容","标题",0);

//卸载钩子,不卸载就好比插完队还不肯让出来。
hookMessageBoxW.unInstall();

//多线程 API 钩子
import thread.apiHook;
var hookGetCursorPos = thread.apiHook(
    "user32.dll",
    "GetCursorPos",
    "bool(pointer lpPoint )", 
    function( lpPoint ){
        //可选用 owner.callApi 调用原始的 API 函数。
        owner.callApi(lpPoint); 

        //猜一猜去掉下面这句,结果有什么不同?!
        return true;

        //钩子中结构体指针参数应当直接传指针 
        //可用 raw.mixin 向结构体结针复制数据而不改变原来的指针地址。
        raw.mixin( lpPoint,{
                int x = 123; 
                int y = 456 
        } );


        return true;
    }
).install();

//调用 API
var point = ::POINT();
::User32.GetCursorPos(point);

import win.dlg.message;
win.dlg.message().info( "x=%d,y=%d",,point.x,point.y );

//卸载钩子,不卸载就好比插完队还不肯让出来
hookGetCursorPos.unInstall();

Markdown 格式