找回密码
 加入
搜索
查看: 2601|回复: 6

关于“窗口手术师”的脚本,请教各位达人

[复制链接]
发表于 2010-1-5 22:57:52 | 显示全部楼层 |阅读模式
本帖最后由 大马哈鱼 于 2010-1-13 23:08 编辑

我很喜欢一款叫“窗口手术师”的小程序,是用AutoIt3编写的,运行的时候,弹出窗口如下:

只要在“跟随鼠标”选项中打勾,随便移动鼠标到哪里,就可以即时捕获鼠标所在的窗口的标题。
我于是找来“窗口手术师”的AutoIt3脚本,但多番测试,所捕获的标题都不是鼠标所在窗口的,而是那些隐藏窗口的标题,见下图:

想请教各位达人,问题出在什么地方呀?
如果想实现移动鼠标到哪里,就可以即时捕获鼠标所在的窗口的标题,那应该改动哪个地方呀?
先拜谢各位达人!!!!
“窗口手术师”的代码如下:

——————————————————————————————

#include <GUIConstants.au3>
#Include <GuiCombobox.au3>
#include <Constants.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#NoTrayIcon
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 变量声明
Dim $Mode = 2, $Ver = "v1.0"
Dim $aboutwin,$email,$Label_03,$Edit1,$send,$aboutwinClose,$oconted

Global Const $TB_LINEUP               = 0
Global Const $TB_LINEDOWN             = 1
Global Const $TB_PAGEUP               = 2
Global Const $TB_PAGEDOWN             = 3
Global Const $TB_THUMBPOSITION        = 4
Global Const $TB_THUMBTRACK           = 5
Global Const $TB_TOP                  = 6
Global Const $TB_BOTTOM               = 7
Global Const $TB_ENDTRACK             = 8
Global $list[22]
$list[0] = "「开始」菜单"
$list[1] = "Default IME"
$list[2] = "M"
$list[3] = "SysFader"
$list[4] = "MCI command handling window"
$list[5] = "DirectorExtension"
$list[6] = "CiceroUIWndFrame"
$list[7] = "TF_FloatingLangBar_WndTitle"
$list[8] = "NetDDE Agent"
$list[9] = "TrayIcon"
$list[10] = "CAsyncSocketEx Helper Window"
$list[11] = "Socket Notification Sink"
$list[12] = "Logitech GetMessage Hook"
$list[13] = "LogiTrayMgrWnd"
$list[14] = "Logitech E/M Executive"
$list[15] = "Connections Tray"
$list[16] = "电表"
$list[17] = "Program Manager"
$list[18] = "?汐杵湩圠湩潤wж"
$list[19] = "Acrobat IEHelper"
$list[20] = "MS_WebcheckMonitor"
$list[21] = "窗口手术师 " & $Ver
$blist = StringSplit(IniRead("config.ini","config","black",""),"|")
If Not @error Then
ReDim $list[22+$blist[0]]
For $i = 1 to $blist[0]
$list[21+$i] = $blist[$i]
Next
EndIf
If IniRead("config.ini","config","isshowmore","false") = "true" Then
$height = 356
$text = " 化简↑"
Else
$height = 81
$text = " 详细↓"
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 脚本开始
Opt("GUIOnEventMode", 1)
Opt("TrayOnEventMode",1)
Opt("WinTitleMatchMode",4)
Opt("TrayMenuMode",1)
Opt('GUIResizeMode', 802)
TraySetState()
TraySetToolTip ( "窗口手术师 " & $Ver )
Opt("TrayIconHide",1)
TraySetOnEvent ($TRAY_EVENT_PRIMARYDOWN, "showwin" )
$Parent = GUICreate("") ;用于隐藏任务栏图标
$main = GUICreate("窗口手术师 " & $Ver, 217,$height,@DesktopWidth - 244,24, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE),$Parent)
GUISetOnEvent($GUI_EVENT_MINIMIZE, "totray")
GUISetOnEvent($GUI_EVENT_CLOSE, "exitprograme")
GUICtrlCreateLabel("窗口标题:", 6, 6, 64, 17)
$win_titles = GUICtrlCreateCombo("", 6, 24, 205, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$WS_HSCROLL,$WS_VSCROLL))
$p_follow = GUICtrlCreateCheckbox("跟随鼠标", 139, 4, 74, 17)
$p_exit = GUICtrlCreateButton("退出", 165, 53, 46, 22, $BS_FLAT)
$win_more = GUICtrlCreateButton($text, 5, 53, 46, 22, $BS_FLAT)
$p_tools = GUICtrlCreateButton("工具", 114, 53, 46, 22, $BS_FLAT)
GUICtrlCreateGroup("窗口信息", 5, 84, 207, 169)
GUICtrlCreateLabel("标题[", 12, 106, 31, 17)
$win_title = GUICtrlCreateInput("", 13, 124, 191, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
$win_change_title = GUICtrlCreateLabel("修改", 43, 106, 28, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($win_change_title, 0)
$win_copy_title = GUICtrlCreateLabel("(&C)", 77, 106, 28, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($win_copy_title, 0)
GUICtrlCreateLabel("]:", 102, 106, 10, 17)
GUICtrlCreateLabel(",", 70, 106, 7, 17)
$win_change_chan = GUICtrlCreateLabel("取消", 178, 106, 28, 17)
GUICtrlSetState (-1,$GUI_HIDE)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($win_change_chan, 0)
$win_change_ok = GUICtrlCreateLabel("保存", 148, 106, 24, 17)
GUICtrlSetState (-1,$GUI_HIDE)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($win_change_ok, 0)
GUICtrlCreateLabel("状态:", 12, 156, 31, 17)
$win_trans = GUICtrlCreateSlider(111, 150, 98, 20)
GUICtrlSetLimit ($win_trans,255)
GUICtrlSetData($win_trans, 255)
GUICtrlCreateLabel("窗口文字[", 13, 180, 55, 17)
$win_copy_text = GUICtrlCreateLabel("复制", 68, 180, 28, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($win_copy_text, 0)
GUICtrlCreateLabel("]:", 92, 180, 10, 17)
$win_state = GUICtrlCreateCombo("", 44, 151, 65, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "隐藏|显示|禁用|可用|最大化|最小化")
$win_text = GUICtrlCreateEdit("", 13, 196, 192, 21, BitOR($ES_READONLY,$ES_WANTRETURN))
$win_close = GUICtrlCreateButton("关闭窗口", 141, 223, 64, 22, $BS_FLAT)
$win_on_top = GUICtrlCreateButton("窗口置顶", 72, 223, 64, 22, $BS_FLAT)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("控件信息", 5, 254, 207, 97)
GUICtrlCreateLabel("控件ID:", 12, 278, 42, 17)
$ctrl_ids = GUICtrlCreateCombo("", 56, 273, 148, 25,BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL,$WS_HSCROLL,$WS_VSCROLL))
GUICtrlCreateLabel("控件文字[", 12, 302, 55, 17)
$ctrl_change_text = GUICtrlCreateLabel("修改", 67, 302, 24, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($ctrl_change_text, 0)
GUICtrlCreateLabel(",", 92, 302, 7, 17)
$ctrl_copy_text = GUICtrlCreateLabel("复制", 98, 302, 28, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($ctrl_copy_text, 0)
GUICtrlCreateLabel("]:", 123, 302, 10, 17)
$ctrl_change_ok = GUICtrlCreateLabel("保存", 148, 302, 24, 17)
GUICtrlSetState (-1,$GUI_HIDE)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor ($ctrl_change_ok, 0)
$ctrl_text = GUICtrlCreateInput("", 12, 321, 192, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
$ctrl_change_chan = GUICtrlCreateLabel("取消", 178, 302, 28, 17)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetState (-1,$GUI_HIDE)
GUICtrlSetCursor ($ctrl_change_chan, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
;;;;;; Menu
$ToolsDummy   = GUICtrlCreateDummy()
$ToolsContext = GUICtrlCreateContextMenu($ToolsDummy)
$p_view_keys = GUICtrlCreateMenuItem("设置热键", $ToolsContext)
$p_black_wins = GUICtrlCreateMenuItem("窗口过滤", $ToolsContext)
$p_about = GUICtrlCreateMenuItem("关于/Bug上报", $ToolsContext)
GUICtrlCreateMenuItem("", $ToolsContext)
$p_visti = GUICtrlCreateMenuItem("访问网站...", $ToolsContext)
$p_check_new = GUICtrlCreateMenuItem("检查更新...", $ToolsContext)
GUICtrlSetOnEvent ($win_titles,"load_title_for_ctrl")
GUICtrlSetOnEvent ($win_more,"show_more")
GUICtrlSetOnEvent ($p_exit,"exitprograme")
GUICtrlSetOnEvent ($win_close,"close_win")
GUICtrlSetOnEvent ($win_on_top,"on_top")
GUICtrlSetOnEvent ($win_state,"set_state")
GUICtrlSetOnEvent ($win_copy_title,"copy_text")
GUICtrlSetOnEvent ($win_copy_text,"copy_text")
GUICtrlSetOnEvent ($ctrl_copy_text,"copy_text")
GUICtrlSetOnEvent ($win_change_title,"change_title")
GUICtrlSetOnEvent ($win_change_ok,"change_title")
GUICtrlSetOnEvent ($win_change_chan,"change_title")
GUICtrlSetOnEvent ($ctrl_ids,"load_ctrl")
GUICtrlSetOnEvent ($ctrl_change_text,"change_text")
GUICtrlSetOnEvent ($ctrl_change_ok,"change_text")
GUICtrlSetOnEvent ($ctrl_change_chan,"change_text")
GUICtrlSetOnEvent ($p_follow,"change_mode")
GUICtrlSetOnEvent ($p_tools,"show_tool_menu")
GUICtrlSetOnEvent ($p_about,"show_about")
GUICtrlSetOnEvent ($p_visti,"vistblog")
GUICtrlSetOnEvent ($p_check_new,"Update")
If IniRead("config.ini","config","mouse","false") = "true" Then
$Mode = 2
GUICtrlSetState ($p_follow ,$GUI_CHECKED)
Else
$Mode = 1
GUICtrlSetState ($p_follow ,$GUI_UNCHECKED)
EndIf
$otrans = GUICtrlRead($win_trans)
$owin = GUICtrlRead($win_titles)
$ohandle = WinGetHandle ($owin)
Dim $octrlid,$ohwins,$to_select_ctrl
Global $owins = load_win_titles(IniRead("config.ini","config","lastwin",""))
load_title()
load_ctrls()
load_text()
Global $ostate = load_state()
$octrlid = GUICtrlRead($ctrl_ids)
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
GUIRegisterMsg($WM_HSCROLL, "MY_WM_HSCROLL")
GUISetState(@SW_SHOW)

While 1
Switch $Mode
Case 1
   Sleep(100)
   $nwins = _GetWins ()
   $owin = WinGetTitle($ohandle)
   If ($owin <> GUICtrlRead($win_title) And $owin <> GUICtrlRead($win_titles)) Or (UBound($owins) <> UBound($nwins) And _CompareArray($nwins,$owins) =0 ) Then
    load_win_titles($owin)
    load_title()
    load_ctrls()
    load_text()
    load_state()
    $owins = $nwins
   EndIf
Case 2
   Sleep(60)
   $nowtitle = WinGetTitle("active")
   If ($nowtitle ="" Or _IsIn($nowtitle) = 1 Or $nowtitle = $list[21]) And WinExists(GUICtrlRead($win_titles)) =0 Then
    load_win_titles()
    load_title()
    load_state()
    load_ctrls()
    load_text()
   ElseIf $nowtitle <> $list[21] Then
    If _IsIn($nowtitle) = 1 Or $nowtitle ="" Then
     load_text()
    ElseIf _IsIn($nowtitle) = 0 And $nowtitle <>"" And ($nowtitle <> GUICtrlRead($win_title) And $nowtitle <> GUICtrlRead($win_titles)) And $nowtitle <> $list[21] Then
     load_win_titles($nowtitle)
     load_title()
     load_state()
     load_ctrls()
     load_text()
    Else
     load_text()
    EndIf
   Else
    load_text()
   EndIf
Case 3
   ;;;该部分代码已隐藏
   change_mode()
Case 4
   ;;;该部分代码已隐藏
   change_mode()
EndSwitch
WEnd
Func Hot_Key()
Switch @HotKeyPressed
Case ""
EndSwitch
EndFunc
Func show_about()
If WinExists("关于") = 1 Then
WinActivate("关于")
Else
$aboutwin = GuiCreate("关于", 215, 190,-1, -1,BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUPWINDOW,$WS_BORDER),-1,$main)
GUISetOnEvent($GUI_EVENT_CLOSE, "exitprograme")
GuiCtrlCreateLabel("版本: " & $Ver, 5, 5, 105, 15)
GuiCtrlCreateLabel("E-mail: ", 5, 20, 40, 15)
$email= GuiCtrlCreateLabel("zcbenz@gmail.com", 46, 20, 100, 15,$SS_NOTIFY)
GUICtrlSetColor(-1,0x0000ff)
GUICtrlSetCursor(-1, 0)
GuiCtrlCreateLabel("Blog: ", 5, 35, 40, 15)
$Label_03 = GuiCtrlCreateLabel("http://my.opera.com/z8519312", 35,35, 170, 15,$SS_NOTIFY)
GUICtrlSetColor($Label_03,0x0000ff)
GUICtrlSetCursor(-1, 0)
GUICtrlCreateLabel("您可以将您的意见通过下面的输入框发送给我:", 5, 64, 207, 25)
$Edit1 = GUICtrlCreateEdit("", 5, 92, 204, 61,$ES_AUTOVSCROLL+$ES_MULTILINE+$ES_WANTRETURN)
$send = GUICtrlCreateButton("发送", 120, 160, 43, 25,$BS_FLAT)
$aboutwinClose = GUICtrlCreateButton("关闭", 168, 160, 43, 25,$BS_FLAT)
GUICtrlSetOnEvent($send,"sendmsg")
GUICtrlSetOnEvent($email, "openemail")
GUICtrlSetOnEvent($aboutwinClose, "exitprograme")
GUICtrlSetOnEvent( $Label_03, "vistblog")
GUISetState(@SW_SHOW,$aboutwin )
EndIf
EndFunc
Func openemail()
ShellExecute("mailto:zcbenz@gmail.com")
EndFunc
Func vistblog()
ShellExecute("http://my.opera.com/z8519312")
EndFunc
Func sendmsg()
$Mode =4
EndFunc
Func show_tool_menu()
ShowMenu($main, $p_tools, $ToolsContext)
EndFunc
Func change_mode()
If GUICtrlRead($p_follow) =1 Then
$Mode = 2
Else
$Mode = 1
EndIf
EndFunc
Func load_ctrl()
$ctrlid = GUICtrlRead($ctrl_ids)
If $octrlid <> $ctrlid Then
_CtrlSet($ctrl_text,ControlGetText(GUICtrlRead($win_titles),"",$ctrlid) )
$octrlid = $ctrlid
EndIf
EndFunc
Func change_text()
$wintitle = GUICtrlRead($win_titles)
Switch @GUI_CtrlId
Case $ctrl_change_text
   GUICtrlSetStyle ($ctrl_text,$ES_AUTOHSCROLL)
   GUIctrlSetState($ctrl_change_chan,$GUI_SHOW)
   GUIctrlSetState($ctrl_change_text,$GUI_DISABLE)
   GUIctrlSetState($ctrl_change_ok,$GUI_SHOW)
Case $ctrl_change_ok
   $owin = WinGetTitle($ohandle)
   ControlSetText ($owin,"",GUICtrlRead($ctrl_ids),GUICtrlRead($ctrl_text))
   ;load_win_titles(GUICtrlRead($win_title))
   GUICtrlSetStyle ($ctrl_text,BitOR($ES_AUTOHSCROLL,$ES_READONLY))
   GUIctrlSetState($ctrl_change_chan,$GUI_HIDE)
   GUIctrlSetState($ctrl_change_text,$GUI_ENABLE)
   GUIctrlSetState($ctrl_change_ok,$GUI_HIDE)
Case $ctrl_change_chan
   _CtrlSet ($ctrl_text,ControlGetText ($wintitle,"",GUICtrlRead($ctrl_ids)))
   GUICtrlSetStyle ($ctrl_text,BitOR($ES_AUTOHSCROLL,$ES_READONLY))
   GUIctrlSetState($ctrl_change_chan,$GUI_HIDE)
   GUIctrlSetState($ctrl_change_text,$GUI_ENABLE)
   GUIctrlSetState($ctrl_change_ok,$GUI_HIDE)
EndSwitch
EndFunc
Func change_title()
$wintitle = GUICtrlRead($win_titles)
Switch @GUI_CtrlId
Case $win_change_title
   GUICtrlSetStyle ($win_title,$ES_AUTOHSCROLL)
   GUIctrlSetState($win_change_chan,$GUI_SHOW)
   GUIctrlSetState($win_change_title,$GUI_DISABLE)
   GUIctrlSetState($win_change_ok,$GUI_SHOW)
Case $win_change_ok
   $owin = WinGetTitle($ohandle)
   WinSetTitle ($owin,"",GUICtrlRead($win_title))
   load_win_titles(GUICtrlRead($win_title))
   GUICtrlSetStyle ($win_title,BitOR($ES_AUTOHSCROLL,$ES_READONLY))
   GUIctrlSetState($win_change_chan,$GUI_HIDE)
   GUIctrlSetState($win_change_title,$GUI_ENABLE)
   GUIctrlSetState($win_change_ok,$GUI_HIDE)
Case $win_change_chan
   _CtrlSet ($win_title,$wintitle)
   GUICtrlSetStyle ($win_title,BitOR($ES_AUTOHSCROLL,$ES_READONLY))
   GUIctrlSetState($win_change_chan,$GUI_HIDE)
   GUIctrlSetState($win_change_title,$GUI_ENABLE)
   GUIctrlSetState($win_change_ok,$GUI_HIDE)
EndSwitch
EndFunc

Func copy_text()
Local $ctrl
Switch @GUI_CtrlId
Case $win_copy_title
   $ctrl = $win_title
Case $win_copy_text
   $ctrl = $win_text
Case $ctrl_copy_text
   $ctrl = $ctrl_text
EndSwitch
ClipPut(GUICtrlRead($ctrl))
MsgBox(270336,"","已复制到剪切板:" & @CRLF &"""" & GUICtrlRead($ctrl) &"""")
EndFunc
Func set_state()
$wintitle = GUICtrlRead($win_titles)
If $ostate <> GUICtrlRead($win_state) Then
$ostate = GUICtrlRead($win_state)
Switch $ostate
Case "隐藏"
   WinSetState ($wintitle, "", @SW_HIDE )
Case "显示"
   WinSetState ($wintitle, "", @SW_SHOW )
Case "禁用"
   WinSetState ($wintitle, "", @SW_DISABLE )
Case "可用"
   WinSetState ($wintitle, "", @SW_ENABLE   )
Case "最大化"
   WinSetState ($wintitle, "", @SW_MAXIMIZE    )
Case "最小化"
   WinSetState ($wintitle, "", @SW_MINIMIZE   )
EndSwitch
EndIf
EndFunc
Func on_top()
$wintitle = GUICtrlRead($win_titles)
If GUICtrlRead($win_on_top) = "窗口置顶" Then
WinSetOnTop ($wintitle,"",1)
GUICtrlSetData($win_on_top,"取消置顶")
ElseIf GUICtrlRead($win_on_top) = "取消置顶" Then
WinSetOnTop ($wintitle,"",0)
GUICtrlSetData($win_on_top,"窗口置顶")
EndIf
EndFunc
Func close_win()
$back = MsgBox(270340,"","确认关闭?")
If $back =6 Then WinKill (GUICtrlRead($win_titles),"")
EndFunc
Func show_more()
$pos = WinGetPos ( "窗口控制工具","")
If GUICtrlRead($win_more) = " 详细↓" Then
WinMove ($main,"", Default, Default, Default , 381)
GUICtrlSetData($win_more," 简化↑")
ElseIf GUICtrlRead($win_more) = " 简化↑" Then
WinMove ($main,"", Default, Default,Default , 106)
GUICtrlSetData($win_more," 详细↓")
EndIf
EndFunc
Func _SetTrans()
$wintitle = GUICtrlRead($win_titles)
If $otrans <> GUICtrlRead($win_trans) Then
$otrans = GUICtrlRead($win_trans)
WinSetTrans ($wintitle,"",$otrans)
EndIf
EndFunc
Func load_win_titles($select = "")
GUICtrlSetData($win_titles,"")
$Wins = _GetWins()
For $x = 1 To UBound($Wins) - 1
_GUICtrlComboBOX_AddString ( $win_titles, $Wins[$x] )
Next
If $select ="" Then
_GUICtrlComboBox_SetCurSel ($win_titles,0)
Else
$var3 = _GUICtrlComboBOX_SelectString ($win_titles,-1,$select)
If $var3 = $CB_ERR Then _GUICtrlComboBox_SetCurSel ($win_titles,0)
EndIf
$owins = $Wins
Return $Wins
EndFunc
Func load_state()
$wintitle = GUICtrlRead($win_titles)
$state = WinGetState ($wintitle)
$state2 = "0"
Select
Case $state =0
   _CtrlSet($win_state,"不存在")
Case $state <=5
   $state2 = "隐藏"
Case 5< $state <=8
   $state2 = "可用"
Case 8< $state <=15
   $state2 = "显示"
Case 15< $state <=31
   $state2 = "最小化"
Case 31< $state
   $state2 = "最大化"
EndSelect
If $state2 <>"0" Then
If $state2<> GUICtrlRead($win_state) Then
   _GUICtrlCombobox_SelectString ($win_state,-1,$state2)
EndIf
EndIf
$ostate = $state2
Return $state2
EndFunc
Func load_title_for_ctrl()
$wintitle = GUICtrlRead($win_titles)
_CtrlSet($win_title,$wintitle)
$ohandle = WinGetHandle ($wintitle)
load_title()
load_ctrls()
load_text()
load_state()
EndFunc
Func load_title()
$wintitle = GUICtrlRead($win_titles)
_CtrlSet($win_title,$wintitle)
$ohandle = WinGetHandle ($wintitle)
EndFunc
Func load_text()
$wintitle = GUICtrlRead($win_titles)
_CtrlSet($win_text,WinGetText ($wintitle))
EndFunc
Func load_ctrls()
$wintitle = GUICtrlRead($win_titles)
GUICtrlSetData($ctrl_ids,"")
GUICtrlSetData($ctrl_text,"")
$classes = StringSplit(_GetClasses($wintitle),@LF)
For $d =1 To UBound($classes) -1
If StringStripWS($classes[$d],3) <>"" Then _GUICtrlComboBox_AddString ($ctrl_ids,$classes[$d])
Next
If $to_select_ctrl ="" Then
_GUICtrlCombobox_SetCurSel ($ctrl_ids,0)
Else
_GUICtrlCombobox_SelectString ($ctrl_ids,-1,$to_select_ctrl)
EndIf
load_ctrl()
EndFunc
Func Update()
$Mode =3
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sys functions
Func MY_WM_HSCROLL($hWnd, $msg, $wParam, $lParam)
$nScrollCode    = BitAnd($wParam, 0x0000FFFF)
    $nPos         = BitShift($wParam, 16)
    $hwndScrollBar = $lParam
Switch $nScrollCode
Case $TB_LINEDOWN ,$TB_LINEUP,$TB_PAGEDOWN,$TB_PAGEUP,$TB_THUMBTRACK
   _SetTrans()
EndSwitch
EndFunc
Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
#forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam) ;NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
$tagNMHDR = 0
    $event = 0
    $lParam = 0
    Return $GUI_RUNDEFMSG
EndFunc
Func showwin()
Opt("TrayIconHide",1)
GuiSetState(@SW_SHOW , $main)
EndFunc
Func totray()
Opt("TrayIconHide",0)
GuiSetState(@SW_HIDE , $main)
EndFunc
Func exitprograme()
if @GUI_WinHandle = $aboutwin Then
GUIDelete($aboutwin)
Else
IniWrite("config.ini","config","lastwin",GUICtrlRead($win_title))
If GUICtrlRead($win_more) = " 简化↑" Then
   IniWrite("config.ini","config","isshowmore","true")
Else
   IniWrite("config.ini","config","isshowmore","false")
EndIf
If $Mode = 2 Then
   IniWrite("config.ini","config","mouse","true")
ElseIf $Mode = 1 Then
   IniWrite("config.ini","config","mouse","false")
EndIf
Exit
EndIf
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 辅助函数
Func _CompareArray($a1,$a2)
$return =0
If UBound($a1) = UBound($a2) Then
$return =1
For $u =0 To UBound($a1) -1
   If $a1[$u] <> $a2[$u] Then $return =0
Next
EndIf
Return $return
EndFunc
Func _GetWins()
Global $ohwins = WinList()
Dim $twins[1]
For $i =1 To $ohwins[0][0]
$title = $ohwins[$i][0]
If StringStripWS($title,3) <>"" And _IsIn($title) = 0 Then
   ReDim $twins[UBound($twins)+1]
   $twins[UBound($twins) -1 ] = $title
EndIf
Next
Return $twins
EndFunc
Func _CtrlSet($ctrl,$var)
If $var <> GUICtrlRead($ctrl) Then
GUICtrlSetData($ctrl,$var)
EndIf
EndFunc
Func _IsIn($var)
$result = 0
$var2 = StringStripWS($var,3)
For $x = 0 To UBound($list) - 1
If $var2 = $list[$x] Then $result = 1
Next
Return $result
EndFunc

Func _Name2Link($link,$LinkNames)
$x = 0
For $i =1 to UBound($LinkNames,1) -1
If $link = $LinkNames[$i][0] Then
   $x = $i
   ExitLoop
EndIf
Next
Return $x
EndFunc
Func _Link2Name($link,$LinkNames)
$x= 0
For $i =1 to UBound($LinkNames,1) -1
If $link = $LinkNames[$i][1] Then
   $x = $i
   ExitLoop
EndIf
Next
If $x= 0 Then
Return ""
Else
Return $LinkNames[$x][0]
EndIf
EndFunc
Func _GetClasses($title)
;Get array of each control
    Local $buttonCount = 0, $editCount = 0, $staticCount = 0, $i
    Local $classes = StringSplit( WinGetClassList($title) , @LF)
    Local $classIDs[$classes[0]+1]
Local $count[1][2]
    $classIDs[0] = $classes[0]
    For $i = 1 to $classes[0]
      Select
      Case $classes[$i] = "Button"
$buttonCount = $buttonCount + 1
$classIDs[$i] = $classes[$i] & $buttonCount
      Case $classes[$i] = "Edit"
        $editCount = $editCount + 1
        $classIDs[$i] = $classes[$i] & $editCount
        $classes[$i] = "Input"
      Case $classes[$i] = "Static"
        $staticCount = $staticCount + 1
        $classIDs[$i] = $classes[$i] & $staticCount
$classes[$i] = "Label"
     Case Else
        If StringStripWS($classes[$i],3) <> "" Then
   $back = _Name2Link($classes[$i],$count)
   If $back = 0 Then
    ReDim $count[UBound($count)+1][2]
    $count[UBound($count)-1][0] = $classes[$i]
    $count[UBound($count)-1][1] = 1
    $classIDs[$i] = $classes[$i] & 1
   Else
    $classIDs[$i] = $count[$back][0] & ($count[$back][1]+1)
    $count[$back][1] +=1
   EndIf
EndIf
      EndSelect
   Next
   Local $classIDs2[1]
   For $i = 1 to $classIDs[0]
If StringStripWS($classIDs[$i],3) <> "" Then
   ReDim $classIDs2[UBound($classIDs2)+1]
   $classIDs2[UBound($classIDs2)-1] = $classIDs[$i]
EndIf
   Next
;Display the results
    Local $output = ""
    For $i = 1 to UBound($classIDs2) -1
$output = $output & $classIDs2[$i] & @LF
    Next
    Return $output
EndFunc
Func ShowMenu($hWnd, $CtrlID, $nContextID)
    Local $hMenu = GUICtrlGetHandle($nContextID)
   
    $arPos = ControlGetPos($hWnd, "", $CtrlID)
   
    Local $x = $arPos[0]
    Local $y = $arPos[1] + $arPos[3]
   
    ClientToScreen($hWnd, $x, $y)
    TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc
; Convert the client (GUI) coordinates to screen (desktop) coordinates
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate("int;int")
   
    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)
    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
   
    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    ; release Struct not really needed as it is a local
    $stPoint = 0
EndFunc
; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc

本帖子中包含更多资源

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

×
发表于 2010-1-6 09:53:59 | 显示全部楼层
加一句检测鼠标所在位置窗口是否处于显示状态就行了。。。
BitAnd(WinGetState( "窗口标题" [, "窗口文本"]),2)
 楼主| 发表于 2010-1-6 10:47:48 | 显示全部楼层
加一句检测鼠标所在位置窗口是否处于显示状态就行了。。。
BitAnd(WinGetState( "窗口标题" [, "窗口文本" ...
sanmoking 发表于 2010-1-6 09:53

谢谢大哥指点~~~~
劳烦大哥再明示,加在那个位置?是在下面这部分吗?插入其中的哪个地方?
在下超级菜鸟,才刚开始接触AutoIt3,实在不好意思~~~~
再次感谢大哥~~~~

——————————————————————————————

Case 2
   Sleep(60)
   $nowtitle = WinGetTitle("active")
   If ($nowtitle ="" Or _IsIn($nowtitle) = 1 Or $nowtitle = $list[21]) And WinExists(GUICtrlRead($win_titles)) =0 Then
    load_win_titles()
    load_title()
    load_state()
    load_ctrls()
    load_text()
   ElseIf $nowtitle <> $list[21] Then
    If _IsIn($nowtitle) = 1 Or $nowtitle ="" Then
     load_text()
    ElseIf _IsIn($nowtitle) = 0 And $nowtitle <>"" And ($nowtitle <> GUICtrlRead($win_title) And $nowtitle <> GUICtrlRead($win_titles)) And $nowtitle <> $list[21] Then
     load_win_titles($nowtitle)
     load_title()
     load_state()
     load_ctrls()
     load_text()
    Else
     load_text()
    EndIf
   Else
    load_text()
   EndIf
发表于 2010-1-7 12:13:37 | 显示全部楼层
我没仔细看你的代码,不过我觉得鼠标跟踪应该是以下的原理:
1、获取鼠标的位置【MouseGetPos ( [维数] )】
2、获取窗口列表【WinList ( ["窗口标题" [, "窗口文本"]] ) 】
3、获取窗口列表中的窗口是否处于正常的显示状态,如果是则进行第四步【BitAnd(WinGetState( "窗口标题" [, "窗口文本"]),2)】
4、获取窗口的位置、大小,并一一比对鼠标是否位于窗口之上【WinGetPos ( "窗口标题" [, "窗口文本"] ) 】
5、如果有多个窗口都符合上面的条件,则检测该窗口是否处于激活状态(或位于顶层)。【BitAnd(WinGetState( "窗口标题" [, "窗口文本"]),8)】


经过上面5个步骤的分析,最后只有0或1个窗口符合条件,那就是鼠标下面的窗口啦。。
发表于 2010-1-7 12:36:00 | 显示全部楼层
希望楼主仔细分析分析一楼的代码,应该很容易指导怎么改的。
 楼主| 发表于 2010-1-7 22:51:13 | 显示全部楼层
谢谢sanmoking大哥,认真学习ing~~~~
 楼主| 发表于 2010-1-13 23:10:14 | 显示全部楼层
本帖最后由 大马哈鱼 于 2010-1-13 23:11 编辑

再次感谢楼上各位朋友~~~~
已搞定,下了个AutoIt3的小工具exe2aut,脚本就出来了,已经按我的需要作了改动,再封装回去了~~~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-29 07:37 , Processed in 0.083216 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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