/*
* 窗口探测器
* 作者: lujjjh
* -----------------------------
* modify by mikeSD on 2010/12/6
* append enlarge and save function 加进了小十字标
*
*/
import winex;
import win.ui;
import win.cur;
import mouse;
import mouse.hook;
/*DSG{{*/
var winform = win.form(text="winspy for aardio";right=409;bottom=396;parent=...)
winform.add(
button3={cls="button";text="修改标题";left=30;top=365;right=118;bottom=389;dl=1;dr=1;dt=1;font=LOGFONT(name='SimSun');z=1};
button4={cls="button";text="最小化窗口";left=140;top=365;right=228;bottom=389;dl=1;dr=1;dt=1;font=LOGFONT(name='SimSun');z=2};
button5={cls="button";text="窗口任务栏闪烁";left=250;top=365;right=378;bottom=389;dl=1;dr=1;dt=1;font=LOGFONT(name='SimSun');z=3};
chkForeground={cls="checkbox";text="自动捕获前台窗口";left=153;top=24;right=275;bottom=39;dl=1;dr=1;dt=1;z=23};
chkTopMost={cls="checkbox";text="保持窗口最前";left=51;top=24;right=149;bottom=39;dl=1;dr=1;dt=1;z=22};
groupbox={cls="groupbox";text="当前坐标位置颜色";left=39;top=199;right=186;bottom=245;edge=1;z=32};
labColor={cls="static";left=113;top=216;right=178;bottom=235;border=1;edge=1;font=LOGFONT(name='宋体');transparent=1;z=34};
labX={cls="static";left=73;top=176;right=112;bottom=193;align="center";border=1;font=LOGFONT(name='Microsoft Sans Serif');transparent=1;z=29};
labX2={cls="static";text="X坐标";left=32;top=176;right=67;bottom=193;align="right";font=LOGFONT(name='Microsoft Sans Serif');transparent=1;z=28};
labY={cls="static";left=154;top=176;right=193;bottom=193;align="center";border=1;font=LOGFONT(name='Microsoft Sans Serif');transparent=1;z=31};
lbClass={cls="static";text="类名:";left=214;top=55;right=263;bottom=70;align="right";dl=1;dr=1;dt=1;transparent=1;z=7};
lbHwnd={cls="static";text="窗口句柄:";left=35;top=79;right=92;bottom=91;align="right";dl=1;dr=1;dt=1;transparent=1;z=4};
lbId={cls="static";text="命令ID:";left=213;top=80;right=262;bottom=95;align="right";dl=1;dr=1;dt=1;transparent=1;z=8};
lbParenHwnd={cls="static";text="父窗口句柄:";left=24;top=55;right=92;bottom=70;align="right";dl=1;dr=1;dt=1;transparent=1;z=9};
lbPid={cls="static";text="进程ID:";left=213;top=106;right=262;bottom=121;align="right";dl=1;dr=1;dt=1;transparent=1;z=12};
lbStyle={cls="static";text="基本样式:";left=32;top=103;right=92;bottom=123;align="right";dl=1;dr=1;dt=1;transparent=1;z=5};
lbStyleEx={cls="static";text="扩展样式:";left=30;top=128;right=92;bottom=143;align="right";dl=1;dr=1;dt=1;transparent=1;z=6};
lbText={cls="static";text="文本:";left=42;top=151;right=91;bottom=166;align="right";dl=1;dr=1;dt=1;transparent=1;z=10};
lbTid={cls="static";text="线程ID:";left=213;top=128;right=262;bottom=143;align="right";dl=1;dr=1;dt=1;transparent=1;z=11};
pic1={cls="picturebox";left=9;top=8;right=41;bottom=40;dl=1;dr=1;dt=1;font=LOGFONT(name='SimSun');image=$"\res\1.gif";notify=1;transparent=1;z=25};
picturebox={cls="picturebox";left=202;top=177;right=388;bottom=359;bgcolor=15780518;border=1;font=LOGFONT(name='宋体');notify=1;z=26};
richedit={cls="richedit";left=11;top=246;right=197;bottom=359;edge=1;font=LOGFONT(name='宋体');hscroll=1;multiline=1;vscroll=1;z=27};
static={cls="static";left=45;top=216;right=110;bottom=235;align="center";border=1;font=LOGFONT(name='宋体');transparent=1;z=33};
static7={cls="static";text="Y坐标";left=114;top=176;right=148;bottom=193;align="right";font=LOGFONT(name='Microsoft Sans Serif');transparent=1;z=30};
staticTip={cls="static";text='\u2190 请用鼠标拖动左侧的图标放置于目标窗口上';left=53;top=6;right=310;bottom=25;dl=1;dr=1;transparent=1;z=21};
txtClass={cls="edit";left=271;top=54;right=377;bottom=75;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=17};
txtHwnd={cls="edit";left=101;top=77;right=207;bottom=98;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=14};
txtId={cls="edit";left=271;top=77;right=377;bottom=98;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=18};
txtParenHwnd={cls="static";left=101;top=54;right=207;bottom=75;color=16711680;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(name='Microsoft Sans Serif';underline=1);notify=1;transparent=1;z=24};
txtPid={cls="edit";left=271;top=101;right=377;bottom=122;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=19};
txtStyle={cls="edit";left=101;top=100;right=207;bottom=121;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=15};
txtStyleEx={cls="edit";left=101;top=123;right=207;bottom=144;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=16};
txtText={cls="edit";left=100;top=149;right=376;bottom=172;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=13};
txtTid={cls="edit";left=270;top=125;right=376;bottom=146;dl=1;dr=1;dt=1;edge=1;multiline=1;readonly=1;z=20}
)
/*}}*/
//置顶窗口
win.setTopmost(winform.hwnd,winform.chkTopMost.checked)
winform.chkTopMost.oncommand = function(id,event){
win.setTopmost(winform.hwnd,winform.chkTopMost.checked)
}
//及时显色//
drawColor = function(currentcolor)begin
var hBrush = CreateSolidBrush( currentcolor );
var hdc = GetDC(winform.labColor.hwnd)
FillRect( hdc, winform.labColor.clientRect, hBrush );
DeleteObject( hBrush );
ReleaseDC(winform.labColor.hwnd,hdc);
end;
//放大//
enlarge = function(x,y)begin
x1=x-10;x2=x+10;y1=y-10;y2=y+10;
nWidth=winform.picturebox.right-winform.picturebox.left
nHeight=winform.picturebox.bottom-winform.picturebox.top
nSrcWidth=(x2-x1)
nSrcHeight=(y2-y1)
var hdc1=GetDC(winform.picturebox.hwnd)
var srchdc1=GetDC(0)
StretchBlt(hdc1,0,0,nWidth,nHeight,srchdc1,x1,y1,nSrcWidth,nSrcHeight,0xCC0020/*_SRCCOPY*/)
//画十字线**************************
PatBlt (hdc1, nWidth/2, nWidth/4, 2, nHeight/2, 0xFF0062/*_WHITENESS*/) ;
PatBlt (hdc1, nWidth/2, nWidth/4, 1, nHeight/2, 0x42/*_BLACKNESS*/) ;
PatBlt (hdc1, nWidth/4, nHeight/2, nWidth/2, 2, 0xFF0062/*_WHITENESS*/) ;
PatBlt (hdc1, nWidth/4, nHeight/2, nWidth/2, 1, 0x42/*_BLACKNESS*/) ;
//**********************************
ReleaseDC(winform.picturebox.hwnd,hdc1)
ReleaseDC(0,srchdc1)
end;
//绘图API
Rectangle = Gdi32.api("Rectangle", "int(pointer hDC, int nLeft, int nTop, int nRight, int nBottom)");
SetROP2 = Gdi32.api("SetROP2", "int(pointer hDC, int nMode)");
//加载自定义的鼠标指针
var hCursor = win.cur.loadfile("\res\spy.cur")
//防卡
winform.wndproc = function(hwnd,message,wparam,lparam){
if( message = 0xA1/*_WM_NCLBUTTONDOWN*/ ){
if( wparam == 20/*_HTCLOSE*/ ){
hk.close()
}
}
else if(message == 0x10/*_WM_CLOSE*/ )
hk.close()
}
//主窗体回调函数
winform.pic1.wndproc = function (hwndSpy, uMsg, wParam, lParam){
select (uMsg){
case 0x201/*_WM_LBUTTONDOWN*/{
winform.pic1.image = $"\res\2.gif";
winform.pic1.capture = true; //捕获全局鼠标消息
win.cur.beginCur();//持续设定鼠标指针
}
case 0x202/*_WM_LBUTTONUP*/{
winform.pic1.image = $"\res\1.gif";
winform.pic1.capture = false; //释放鼠标
win.cur.endCur(); //恢复正常鼠标指针
}
}
}
//显示窗口信息
function showWindowInfo(hwnd){
winform.txtParenHwnd.text = string.format("%X",win.getParent(hwnd) )
winform.txtHwnd.text = string.format("%X",hwnd )
winform.txtClass.text = win.getClass(hwnd)
winform.txtId.text = win.getId(hwnd);
var str = win.getText(hwnd,50) ;
if(str){
winform.txtText.text = string.replace(str,"[\r\n]","")
}
winform.txtStyle.text = tostring(::GetWindowLong(hwnd, 0xFFFFFFF0/*_GWL_STYLE*/) );
winform.txtStyleEx.text = tostring(::GetWindowLong(hwnd, 0xFFFFFFEC/*_GWL_EXSTYLE*/) );
winform.txtTid.text,winform.txtPid.text = win.getThreadProcessId(hwnd)
}
//点击父窗口句柄时显示父窗口信息
winform.txtParenHwnd.oncommand = function(id,event){
var hwnd = tonumber( winform.txtParenHwnd.text,16)
if(hwnd)
showWindowInfo(hwnd);
}
import process
hk = mouse.hook();
hk.proc = function(msg,x,y){
tm=time.now() //取得时间 //
select(msg) {
case 0x201/*_WM_LBUTTONDOWN*/{//tm=time.now()//
winform.richedit.setsel(-1,-1)
winform.richedit.selText = string.format('(%.2d:%02d:%.2d)mouse.down(%d,%d,true)RGB=[%06s]\n',tm.hour,tm.minute,tm.second,x,y,rgbcolor )
}
case 0x200/*_WM_MOUSEMOVE*/{
x,y=mouse.getPos();//得到光标的坐标//
currentcolor=gdi.getPixel(x,y) //得到光标处的色彩//
t=string.format("%.6X", currentcolor) //色彩转换为6位十六进制(BGR)//
rgbcolor="#"++string.pack(t[5],t[6],t[3],t[4],t[1],t[2])
/* t = string.split(bgrcolor,''); //按单个字符开始拆分成数组
rgbcolor=t[5]++t[6]++t[3]++t[4]++t[1]++t[2] //倒序成RGB */
winform.static.text=rgbcolor
winform.labX.text=x;//显示当前X坐标//
winform.labY.text=y;//显示当前Y坐标//
enlarge(x,y)
drawColor(currentcolor );
}
case 0x204/*_WM_RBUTTONDOWN*/{ //点击鼠标右键将记录的鼠标颜色追加保存到文件//
file = assert(io.open(".\mousecolor.txt", "a") ) //以追加方式打开或创建文件//
var hang=winform.richedit.lineCount
tm=time.now()
for(i=-1;hang;1){
var text=winform.richedit.lineText(i)
file.write("第",i+2,"行",text,'\r\n') //将记录的鼠标颜色按行追加写入文件//
}
file.close() //关闭文件//
}
}
}
var hwndSpy;// 用来保存探测到的窗口句柄
tmid = winform.addtimer(
100/*毫秒*/,
function(hwnd,msg,id,tick){
// 定时执行代码
// 如果鼠标指针是探测状态
if ( win.cur.beginning ){
hwndSpy = winex.fromPointReal( mouse.getPos() );
var lpRect = ::RECT();
re, lpRect = ::GetWindowRect(hwndSpy, lpRect);
showWindowInfo(hwndSpy);
if (hwndSpy){
var hDC = ::GetWindowDC(0);
/** 防止溢出 Start **/
if (lpRect.left < 0)
lpRect.left = 0;
if (lpRect.top < 0)
lpRect.top = 0;
if (lpRect.right > ::GetSystemMetrics(0x0/*_SM_CXSCREEN*/))
lpRect.right = ::GetSystemMetrics(0x0/*_SM_CXSCREEN*/);
if (lpRect.bottom > ::GetSystemMetrics(0x1/*_SM_CYSCREEN*/))
lpRect.bottom = ::GetSystemMetrics(0x1/*_SM_CYSCREEN*/);
/** 防止溢出 End **/
var hPen = CreatePen(0x0/*_PS_SOLID*/, 3, 0);
var hOldPen = ::SelectObject(hDC, hPen);
var oldROP2 = SetROP2(hDC, 0xA/*_R2_NOTXORPEN*/);
Rectangle(hDC, lpRect.left, lpRect.top, lpRect.right, lpRect.bottom);
sleep(10);
Rectangle(hDC, lpRect.left, lpRect.top, lpRect.right, lpRect.bottom);
SetROP2(hDC, oldROP2);
::SelectObject(hDC, hOldPen);
::DeleteObject(hPen);
::ReleaseDC(hwndSpy, hDC);
}
}
elseif( winform.chkForeground.checked ){
showWindowInfo( win.getForeground() );
}
sleep(10)
}
);
winform.button3.oncommand = function(id, event){
if (win.msgboxTest("是否用 SendMessage 方式?否则用 SetWindowText", "标题"))
User32.api("SendMessage", "int(int hwndSpy, int uMsg, int wParam,
string lParam)")(hwndSpy, 0xC/*_WM_SETTEXT*/, 0, "我是新的标题");
else
::SetWindowText(hwndSpy, "我是新的标题");
}
winform.button4.oncommand = function(id, event){
select(winform.button4.text){
case "最小化窗口"
{PostMessage(hwndSpy, 0x112/*_WM_SYSCOMMAND*/,0xF020/*_SC_MINIMIZE*/, 0);
//User32.api("CloseWindow","int(int hwndSpy)")(hwndSpy)
winform.button4.text = "最大化窗口"
}
case "最大化窗口"
{PostMessage(hwndSpy, 0x112/*_WM_SYSCOMMAND*/, 0xF030/*_SC_MAXIMIZE*/,0);
//User32.api("OpenIcon","int(int hwndSpy)")(hwndSpy)
winform.button4.text="最小化窗口"
}
}
}
winform.button5.oncommand = function(id, event){
User32.api("FlashWindow", "int(int hwndSpy, int bInvert)")(
hwndSpy, win.msgboxTest("是否仅闪烁一次?否则持续闪烁") ? 1 : 0);
}
winform.show(true);
win.loopMessage();
return winform;
发表评论