sanmoking 发表于 2009-11-25 11:20:23

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

本帖最后由 sanmoking 于 2009-11-26 13:22 编辑

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

水分子脚本论坛 发表于 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;

顽固不化 发表于 2009-11-25 15:25:05

与提问无关的

catcher 发表于 2009-11-25 17:51:50

看下顽固老大的是什么

sanmoking 发表于 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增加了更多的可设置参数

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



sanmoking 发表于 2009-11-25 23:30:32

本帖最后由 sanmoking 于 2009-11-26 17:16 编辑

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

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

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

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



            ↑↑↑QQ的效果↑↑↑



            ↑↑↑模拟的效果↑↑↑

afan 发表于 2009-11-26 20:49:13

回复 6# sanmoking


    LS的前辈MS已经搞定鼠标方案了?

styledream 发表于 2009-11-26 21:11:09

好东西啊,严重支持~~~

sanmoking 发表于 2009-11-26 21:52:44

回复 7# afan


    有点眉目,距离搞定的重点已经前进了30%的路程了

pusofalse 发表于 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, $aPos, $aPos + $aPos, $aPos + $aPos, 0)
                _Quit()
;                _HideChild()
        EndIf
EndFunc        ;==>_SaveCapture

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

        $aXY = MouseGetPos()
        $aWindowPos = WinGetPos($hChild)
        $aPosDiff = $aXY - $aWindowPos
        $aPosDiff = $aXY - $aWindowPos
        $hRgn1 = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DeskTopHeight)
        While _IsPressed("01")
                $aXY = MouseGetPos()
                WinMove($hChild, "", $aXY - $aPosDiff, $aXY - $aPosDiff)
                $hRgn = _WinAPI_CreateRectRgn($aXY - $aPosDiff, $aXY - $aPosDiff, $aXY - $aPosDiff + $aWindowPos, $aXY - $aPosDiff + $aWindowPos)
                _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
        $i_Y = $aXY
        $hRgn1 = _WinAPI_CreateRectRgn(0, 0, @DesktopWidth, @DesktopHeight)
        While _IsPressed("01")
                $aXY = MouseGetPos()
                $iX = $aXY
                $iY = $aXY
                $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
刚写的,有些混乱,希望可以帮助到你。

sanmoking 发表于 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.....特别是那个中间选区部分边框完全透明......

kn007 发表于 2009-11-27 08:45:30

Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!?

11250000 发表于 2009-11-27 12:50:55

学习了。好久没来了

ajian55 发表于 2009-11-27 14:53:46

哈哈哈哈哈哈,好东东

sanmoking 发表于 2009-11-27 15:02:45

Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!?
kn007 发表于 2009-11-27 08:45 http://www.autoitx.com/images/common/back.gif


    3.3.0.0
页: [1] 2 3
查看完整版本: 请教Autoit V3 窗口信息工具显示在控件或窗口边缘的线框的原理