找回密码
 加入
搜索
查看: 14411|回复: 33

请教Autoit V3 窗口信息工具显示在控件或窗口边缘的线框的原理

 火... [复制链接]
发表于 2009-11-25 11:20:23 | 显示全部楼层 |阅读模式
本帖最后由 sanmoking 于 2009-11-26 13:22 编辑

我想知道Autoit V3 窗口信息工具显示在控件或窗口边缘的黑线框的原理 ,
这种边框是否能够在桌面上的任意大小和颜色和位置显示出来,
au3自身能否实现?.....
因为想要制作一个截图工具......
找了论坛,有个别资料但是不太理想.......
大侠来帮帮忙啊..奉上200金币......

评分

参与人数 1金钱 +20 收起 理由
kn007 + 20 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2009-11-25 13:45:43 | 显示全部楼层
调用api实现的
我这里给个模拟精灵实现的代码给你参考下

--高亮窗体要用到的API函数
GetWindowDC = dll.open("user32", "GetWindowDC", "i(i)");--获取绘图句柄
ReleaseDC = dll.open("user32", "ReleaseDC", "i(i,i)");--释放绘图句柄
PatBlt = dll.open("gdi32", "PatBlt", "i(i,i,i,i,i,i)");--画线
IsWindow = dll.open("user32", "IsWindow", "i(i)");--判断是否有效句柄

--高亮窗体要用到的常量
_DINV  = 3;
_DSTINVERT  = 0x00550009;--反色

--下面的函数高亮、取消高亮指定的窗体,参数指定窗体句柄
function win.hl( hwnd )
    if (hwnd == _NULL or IsWindow(hwnd)==_FALSE)then
        return;
    end;

    local hdc = GetWindowDC(hwnd);
    local left,top,right,bottom = win.getRect(hwnd)
    right = right - left;
    bottom = bottom - top;
    left = 0;
    top = 0;

    if (right>0 and bottom>0)then
        PatBlt(hdc, left, top, right - left, _DINV,  _DSTINVERT);
        PatBlt(hdc, left, bottom - _DINV, _DINV,-(bottom - top - 2 * _DINV), _DSTINVERT);
        PatBlt(hdc, right - _DINV, top + _DINV, _DINV, bottom - top - 2 * _DINV, _DSTINVERT);
        PatBlt(hdc, right, bottom - _DINV, -(right - left),  _DINV, _DSTINVERT);
    end;

    ReleaseDC(hwnd, hdc);
end;

评分

参与人数 1金钱 +100 收起 理由
sanmoking + 100 虽然没看明白(本人菜鸟一个),不过应该是跟一 ...

查看全部评分

发表于 2009-11-25 15:25:05 | 显示全部楼层
与提问无关的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +20 收起 理由
sanmoking + 20 给顽固不化20(因为没有源码),给sanmoking10 ...

查看全部评分

发表于 2009-11-25 17:51:50 | 显示全部楼层
看下顽固老大的是什么
 楼主| 发表于 2009-11-25 23:26:13 | 显示全部楼层
本帖最后由 sanmoking 于 2009-11-26 17:24 编辑
 ;配置文件的内容:

[设置]
$dian = 0x2d5868
 ;$dian==>选区周围8个点块的颜色:0x000000-0xffffff

$line = 0x2d5868
 ;$line==>选区周围4条边线的颜色:0x000000-0xffffff

$dianw = 4
 ;$dianw==>8个点块的宽度:单位为像素

$dianh=5
 ;$dianw==>8个点块的高度:单位为像素

$linew = 1
 ;$linew==>4条边线的宽度:单位为像素

$dians = -2
 ;$dians==>8个点块的收缩程度,设为0时正好内切于选区

$lines = 2
 ;$lines==>4条边线的收缩程度,设为0时内切于8个点块

$color0 = 0x000000
 ;$color0==>选区外围的颜色:0x000000-0xffffff

$color1 = 0x9090f2
 ;$color1==>选区块的底色:0x000000-0xffffff

$alpha0 = 5
 ;$alpha0==>选区外围的透明度:0(全透)-255(不透)

$alpha1 = 30
 ;$alpha1==>选区块的透明度:0(全透)-255(不透)

$move1=1
 ;$xxyyt1==>坐标提示的文字颜色:0x000000-0xffffff

$xxyy1=1
 ;$xxyyc1==>坐标提示的色块颜色:0x000000-0xffffff

$xxyyc1=0x000000
 ;$xxyy1==>坐标提示是否显示:0(不能)-1(能)

$xxyyt1=0xffffff
 ;$move1==>选区块是否可移动:0(不能)-1(能)

$xxyyleft1=0
 ;$xxyyleft1==>坐标提示的左侧距离:像素为单位

$xxyytop1=-30
 ;$xxyytop1==>坐标提示的顶端距离:像素为单位

$dianshow=1
 ;$dianshow==>是否显示选区周围8个点块:非1(否)-1(是)

$lineshow=1
 ;$lineshow==>是否显示选区周围4条边线:非1(否)-1(是)
2楼的东西,我也没看懂..不过我自己琢磨了一点出来.....给大家分享一下:



周围的暗色部分颜色可以定制,
周围的暗色部分透明度可以定制,
中间选框内的颜色可以定制,
中间选框内的透明度也可以定制,
周围8个色块的颜色可以定制,
周围8个色块的尺寸可以定制,
周围4条边框的颜色可以定制,
周围4条边框的粗细可以定制,
周围色块的收缩程度可以定制,
周围边框线条的收缩程度也可以定制,

具体参数使用ini配置....源码回头另开贴再发...


091126-17:18 更新:
1优化了ini的读取,
2修改了很多处问题:比如不能从右下往左上方框选的重大bug,
3增加了更多的可设置参数


下一步增加截图工具条,那个不难.....



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 3威望 +20 金钱 +135 贡献 +49 收起 理由
lynfr8 + 35 + 9 精品文章
kn007 + 10 + 50 + 20 厉害、佩服
afan + 10 + 50 + 20 厉害、佩服

查看全部评分

 楼主| 发表于 2009-11-25 23:30:32 | 显示全部楼层
本帖最后由 sanmoking 于 2009-11-26 17:16 编辑

楼上的选框操作方法和QQ截图的一摸一样,仅仅没有截图功能而已(实验性的半成品,回头加上qq截图那样的工具栏..)....

快捷键:右键退出\esc退出\

如果有选区的话第一次退出命令是先取消选区,第二次才会退出程序,没有选区的话直接就退了.....
鼠标放到中间的选区可以移动选区的框,鼠标放到选取的四边可以缩放选区

下边给大家一个高仿QQ截图的配置参数:



              ↑↑↑QQ的效果↑↑↑



            ↑↑↑模拟的效果↑↑↑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-11-26 20:49:13 | 显示全部楼层
回复 6# sanmoking


    LS的前辈MS已经搞定鼠标方案了?
发表于 2009-11-26 21:11:09 | 显示全部楼层
好东西啊,严重支持~~~
 楼主| 发表于 2009-11-26 21:52:44 | 显示全部楼层
回复 7# afan


    有点眉目,距离搞定的重点已经前进了30%的路程了
发表于 2009-11-26 22:29:08 | 显示全部楼层
#include <Misc.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <ScreenCapture.au3>
#include <BorderConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

_GDIPlus_Startup()

Global $i_X, $i_Y, $iX, $iY, $hGraphics

$hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, 0, WinGetHandle(""))
GUISetBkColor(0, $hGUI)
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_StartCapture")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")

WinSetOnTop($hGUI, "", 1)
WinSetTrans($hGUI, "", 100)
GUISetState()

$hChild = GUICreate("4", 400, 300, -1, -1, $WS_SIZEBOX + $WS_POPUP, 0x200, $hGUI)
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_MoveRect")
GUISetOnEvent($GUI_EVENT_CLOSE, "_HideChild")

Func _HideChild()
        GUISetState(@SW_HIDE, $hChild)
        _WinAPI_SetWindowRgn($hGUI, 0, 0)
EndFunc        ;==>_HideChild


WinSetTrans($hChild, "", 5)


GUIRegisterMsg($WM_SIZING, "_WM_SIZING")
GUIRegisterMsg($WM_LBUTTONDBLCLK, "_SaveCapture")

Func _WM_SIZING($hWnd, $iMsg, $iwParam, $ilParam)
        If $hWnd = $hChild Then
                Local $tRect = DllStructCreate($tagRECT, $ilParam)
                Local $hRgn1 = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DesktopHeight)
                Local $hRgn = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), DllStructGetData($tRect, 3), DllStructGetData($tRect, 4))
                _WinAPI_CombineRgn($hRgn, $hRgn1, $hRgn, $RGN_XOR)
                _WinAPI_SetWindowRgn($hGUI, $hRgn, True)
        EndIf
EndFunc        ;==>_WM_SIZING




Func _SaveCapture($hWnd, $iMsg, $iwParam, $ilParam)
        If $hWnd = $hChild Then
                Local $aPos = WinGetPos($hChild)
                _ScreenCapture_Capture("A.JPG", $aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3], 0)
                _Quit()
;                _HideChild()
        EndIf
EndFunc        ;==>_SaveCapture

Func _MoveRect()
        Local $aXY, $hRgn, $hRgn1, $aPosDiff[2], $aWindowPos

        $aXY = MouseGetPos()
        $aWindowPos = WinGetPos($hChild)
        $aPosDiff[0] = $aXY[0] - $aWindowPos[0]
        $aPosDiff[1] = $aXY[1] - $aWindowPos[1]
        $hRgn1 = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DeskTopHeight)
        While _IsPressed("01")
                $aXY = MouseGetPos()
                WinMove($hChild, "", $aXY[0] - $aPosDiff[0], $aXY[1] - $aPosDiff[1])
                $hRgn = _WinAPI_CreateRectRgn($aXY[0] - $aPosDiff[0], $aXY[1] - $aPosDiff[1], $aXY[0] - $aPosDiff[0] + $aWindowPos[2], $aXY[1] - $aPosDiff[1] + $aWindowPos[3])
                _WinAPI_CombineRgn($hRgn, $hRgn1, $hRgn, $RGN_XOR)
                _WinAPI_SetWindowRgn($hGUI, $hRgn, True)
        WEnd
EndFunc




While 1
        Sleep(1000)
WEnd

Func _Quit()
        Exit
EndFunc

Func _StartCapture()
        Local $aXY, $hRgn, $hRgn1
        $aXY = MouseGetPos()
        $i_X = $aXY[0]
        $i_Y = $aXY[1]
        $hRgn1 = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DesktopHeight)
        While _IsPressed("01")
                $aXY = MouseGetPos()
                $iX = $aXY[0]
                $iY = $aXY[1]
                $hRgn = _WinAPI_CreateRectRgn($i_X, $i_Y, $iX, $iY)
                _WinAPI_CombineRgn($hRgn, $hRgn1, $hRgn, $RGN_XOR)
                _WinAPI_SetWindowRgn($hGUI, $hRgn, True)
        WEnd
        WinMove($hChild, "", $i_X, $i_Y, $iX - $i_X, $iY - $i_Y)
        GUISetState(@SW_SHOW, $hChild)
        ConsoleWrite($i_X & " " & $iX & "    " & $i_Y & " " & $iY & @CRLF)
EndFunc
刚写的,有些混乱,希望可以帮助到你。
 楼主| 发表于 2009-11-26 22:51:37 | 显示全部楼层
本帖最后由 sanmoking 于 2009-11-27 15:06 编辑

回复 10# pusofalse

D:\My Documents\桌面\新建 AutoIt v3 脚本.au3(38,33) : WARNING: $WM_LBUTTONDBLCLK: 使用前并未进行声明.
GUIRegisterMsg($WM_LBUTTONDBLCLK,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本.au3(38,33) : ERROR: $WM_LBUTTONDBLCLK: undeclared global variable.
GUIRegisterMsg($WM_LBUTTONDBLCLK,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本.au3 - 1 error(s), 1 warning(s)


多谢啦.....太晚了注意力一点都集中不起来..明天在看吧...


091127-15:06,貌似解决了我好几个问题,多谢pusofalse.....特别是那个中间选区部分边框完全透明......
发表于 2009-11-27 08:45:30 | 显示全部楼层
Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!?
发表于 2009-11-27 12:50:55 | 显示全部楼层
学习了。好久没来了
发表于 2009-11-27 14:53:46 | 显示全部楼层
哈哈哈哈哈哈,好东东
 楼主| 发表于 2009-11-27 15:02:45 | 显示全部楼层
Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!?
kn007 发表于 2009-11-27 08:45



    3.3.0.0
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 07:55 , Processed in 0.095387 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表