请教Autoit V3 窗口信息工具显示在控件或窗口边缘的线框的原理
本帖最后由 sanmoking 于 2009-11-26 13:22 编辑我想知道Autoit V3 窗口信息工具显示在控件或窗口边缘的黑线框的原理 ,
这种边框是否能够在桌面上的任意大小和颜色和位置显示出来,
au3自身能否实现?.....
因为想要制作一个截图工具......
找了论坛,有个别资料但是不太理想.......
大侠来帮帮忙啊..奉上200金币...... 调用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; 与提问无关的 看下顽固老大的是什么 本帖最后由 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-26 17:16 编辑
楼上的选框操作方法和QQ截图的一摸一样,仅仅没有截图功能而已(实验性的半成品,回头加上qq截图那样的工具栏..)....
快捷键:右键退出\esc退出\
如果有选区的话第一次退出命令是先取消选区,第二次才会退出程序,没有选区的话直接就退了.....
鼠标放到中间的选区可以移动选区的框,鼠标放到选取的四边可以缩放选区
下边给大家一个高仿QQ截图的配置参数:
↑↑↑QQ的效果↑↑↑
↑↑↑模拟的效果↑↑↑ 回复 6# sanmoking
LS的前辈MS已经搞定鼠标方案了? 好东西啊,严重支持~~~ 回复 7# afan
有点眉目,距离搞定的重点已经前进了30%的路程了 #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-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.....特别是那个中间选区部分边框完全透明...... Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!? 学习了。好久没来了 哈哈哈哈哈哈,好东东 Global Const $WM_LBUTTONDBLCLK = 0x203
你的版本太老了吧!?
kn007 发表于 2009-11-27 08:45 http://www.autoitx.com/images/common/back.gif
3.3.0.0