import com; |
var oleaut = raw.loadDll( "OleAut32.DLL" ); |
var oleacc = raw.loadDll( "OLEACC.DLL" ); |
IID_IAccessible = '\xE0\x36\x87\x61\x3D\x3C\xCF\x11\x81\x0C\x00\xAA\x00\x38\x9B\x71' ; |
var findAccessibleChildren; |
findAccessibleChildren = function (accParent,name){ |
var variants = { |
struct item[] ={ //这里没有声明数组长度 |
length = accParent.accChildCount; //使用length在运行时指定数组长度 |
{ |
WORD vt; |
WORD r1; |
WORD r2; |
WORD r3; |
ptr pdispVal; |
ptr r4; |
}; //结构体数组至少要声明第一个结构体成员 |
} |
} |
|
var obtained = {int size}; //用结构体给API提供int指针 |
var hr = oleacc.AccessibleChildren(accParent, 0,accParent.accChildCount, variants,obtained); |
if ( hr < 0 ) return ; //COM中小于0的都是错误码 |
for (i=1;obtained.size;1){ |
var variant = variants.item[ i ] |
if ( variant.vt != 9 /*_VT_DISPATCH*/ ) { |
oleaut.VariantClear(variant); |
continue ; |
} |
|
var accChild = com.QueryObject( variant.pdispVal ); //转换为COM对象(COM.IDispatch) |
oleaut.VariantClear(variant); //释放Variant对象 |
if ( accChild.accName(0 /*CHILDID_SELF*/ ) == name ){ |
var v = accChild.accValue(0 /*CHILDID_SELF*/ ); |
if ( #v) return v; |
} |
|
var v = findAccessibleChildren(accChild,name); |
if ( #v) return v; |
} |
} |
findAccessibleString = function (hwnd,name){ |
var pvObject = {ptr p} |
if ( 0 == oleacc.AccessibleObjectFromWindow(hwnd,0,IID_IAccessible,pvObject) ){ |
var accParent = com.QueryObject( pvObject.p ); //转换为COM对象(COM.IDispatch) |
com.Release(pvObject.p); |
|
return findAccessibleChildren( com.QueryObject( pvObject.p ),name ); |
} |
} |
import winex; |
import console; |
console.setTitle( "读取QQ消息" ) |
console.open() |
var msg; |
while ( true ){ |
var old = msg; |
for hwnd in winex.each( "TXGuiFoundation" ) { |
var qqMessage = findAccessibleString(hwnd, "test" ); |
if ( #qqMessage ) msg = qqMessage; |
} |
if (old!=msg)console.log( msg) |
sleep(10000) |
} |
|
win.loopMessage() |