找回密码
 加入
搜索
查看: 6045|回复: 10

[AU3基础] 【已解决】同一快捷键既能调用也能结束某一自定义函数,如何实现?

[复制链接]
发表于 2015-1-19 11:42:16 | 显示全部楼层 |阅读模式
本帖最后由 三八线 于 2015-1-19 16:35 编辑

例如如下代码,摆弄半天,想实现Au3Info的CTRL+ALT+F切换捕获与暂停捕获效果,无法实现,请高手帮忙!
  1. #include <Misc.au3>
  2. #include <WinAPI.au3>

  3. HotKeySet("^!f", "_WindowFromPoint_KG") ;

  4. Global $g_tStruct = DllStructCreate($tagPOINT) ; 创建定义检查点的结构.
  5. Local $tKG = 1

  6. While 1
  7. WEnd

  8. Func _WindowFromPoint_KG()
  9.         If $tKG = 1 Then
  10.                 $tKG = 0
  11.                 _WindowFromPoint($tKG)
  12.         EndIf
  13. EndFunc   ;==>_WindowFromPoint

  14. Func _WindowFromPoint(ByRef $tKG)          ;检索鼠标位置的窗口句柄.
  15.         While 1
  16.                 ToolTip("")
  17.                 Position() ; 更新鼠标 X 和 Y 坐标和结构的 X 和 Y 的元素.
  18.                 Local $hWnd = _WinAPI_WindowFromPoint($g_tStruct) ; 检索窗口句柄.
  19.                 ToolTip($hWnd, Default, Default, '鼠标下的窗口句柄', 1 ,1)        ; 设置工具提示.
  20.                 Sleep(500)
  21.                 ;If _IsPressed("11") And _IsPressed("12") And _IsPressed("46") Then ExitLoop       ;ctrl+alt+F组合键退出while循环
  22.                 If $tKG = 0 Then
  23.                         ToolTip("")                                       ; 清除工具提示
  24.                         $tKG = 1
  25.                         ExitLoop
  26.                 EndIf
  27.         WEnd
  28. EndFunc   ;==>_WindowFromPoint

  29. Func Position()
  30.         DllStructSetData($g_tStruct, "x", MouseGetPos(0))          ;MouseGetPos(0) = 当前鼠标的 X 坐标
  31.         DllStructSetData($g_tStruct, "y", MouseGetPos(1))          ;MouseGetPos(1) = 当前鼠标的 Y 坐标
  32. EndFunc   ;==>Position
复制代码
 楼主| 发表于 2015-1-19 11:49:44 | 显示全部楼层
自己顶一下,希望大家帮忙,出出主意。
 楼主| 发表于 2015-1-19 12:19:50 | 显示全部楼层
用两个不同快捷键分别执行调用、结束自定义函数,很容易实现,见如何代码:

#include <Misc.au3>
#include <WinAPI.au3>

HotKeySet("^!f", "_WindowFromPoint") ; 设置 CTRL+ALT+T调用自定义函数.

Global $g_tStruct = DllStructCreate($tagPOINT) ; 创建定义检查点的结构.

;_WindowFromPoint()
While 1
        Sleep(100)
WEnd


Func _WindowFromPoint()          ;检索鼠标位置的窗口句柄.
        While 1
                ToolTip("")
                Position() ; 更新鼠标 X 和 Y 坐标和结构的 X 和 Y 的元素.
                Local $hWnd = _WinAPI_WindowFromPoint($g_tStruct) ; 检索窗口句柄.
                ToolTip($hWnd, Default, Default, '鼠标下的窗口句柄', 1 ,1)        ; 设置工具提示.
                Sleep(100)
                If _IsPressed("11") And _IsPressed("12") And _IsPressed("54")  Then    ;CTRL+ALT+T退出While循环
                        ToolTip("")                                       ; 清除工具提示
                        ExitLoop       ;ctrl+ PAUSE组合键退出while循环
                EndIf
        WEnd
EndFunc   ;==>_WindowFromPoint

Func Position()
        DllStructSetData($g_tStruct, "x", MouseGetPos(0))          ;MouseGetPos(0) = 当前鼠标的 X 坐标
        DllStructSetData($g_tStruct, "y", MouseGetPos(1))          ;MouseGetPos(1) = 当前鼠标的 Y 坐标
EndFunc   ;==>Position
 楼主| 发表于 2015-1-19 13:05:11 | 显示全部楼层
再丰富一下窗口信息。
  1. #include <WinAPIProc.au3>
  2. #include <Misc.au3>
  3. #include <WinAPI.au3>

  4. HotKeySet("^!f", "_WindowFromPoint") ; 设置 CTRL+ALT+T调用检索鼠标位置的窗口句柄函数, CTRL+ALT+T结束该函数.
  5. Global $g_tStruct = DllStructCreate($tagPOINT) ; 检索鼠标位置的窗口句柄函数用。创建定义检查点的结构.该变量声明必须在主 While 循环之前。

  6. ;_WindowFromPoint()
  7. While 1
  8.         Sleep(100)
  9. WEnd


  10. Func _WindowFromPoint()          ;检索鼠标位置的窗口句柄.
  11.         While 1
  12.                 ToolTip("")
  13.                 Position() ; 更新鼠标 X 和 Y 坐标和结构的 X 和 Y 的元素.
  14.                 Local $hWnd = _WinAPI_WindowFromPoint($g_tStruct)  ;依据光标位置检索窗口句柄.
  15.                 Local $sTitle = WinGetTitle($hWnd, "")         ;依据句柄获窗口标题
  16.                 Local $hWnd1 = WinGetHandle($hWnd, "")         ;依据句柄获窗口句柄
  17.                 Local $sPid = WinGetProcess($hWnd, '')         ;依据句柄获取窗口关联的进程 ID(PID).
  18.                 Local $Dir = _WinAPI_GetProcessFileName($sPid) ;检索指定进程可执行文件的完全有效路径(含文件名).
  19.                 $sTempText = '标题=' & $sTitle & @CRLF & '句柄 =' & $hWnd & @CRLF & '句柄1=' & $hWnd1 & @CRLF & '进程=' & $sPid & @CRLF & '路径=' & $Dir
  20.                 ToolTip($sTempText, Default, Default, '鼠标下的窗口句柄', 1 ,1)        ; 设置工具提示.
  21.                 Sleep(100)
  22.                 If _IsPressed("11") And _IsPressed("12") And _IsPressed("54")  Then    ;CTRL+ALT+T退出While循环
  23.                         ToolTip("")                                       ; 清除工具提示
  24.                         ExitLoop       ;ctrl+ PAUSE组合键退出while循环
  25.                 EndIf
  26.         WEnd
  27. EndFunc   ;==>_WindowFromPoint

  28. Func Position()
  29.         DllStructSetData($g_tStruct, "x", MouseGetPos(0))          ;MouseGetPos(0) = 当前鼠标的 X 坐标
  30.         DllStructSetData($g_tStruct, "y", MouseGetPos(1))          ;MouseGetPos(1) = 当前鼠标的 Y 坐标
  31. EndFunc   ;==>Position
复制代码
 楼主| 发表于 2015-1-19 13:27:00 | 显示全部楼层
再丰富一个ID信息,请大家走过路过,帮我出出主意,用一个快捷键实现调用和结束自定义函数的功能。
  1. #include <WinAPIProc.au3>
  2. #include <Misc.au3>
  3. #include <WinAPI.au3>

  4. HotKeySet("^!f", "_WindowFromPoint") ; 设置 CTRL+ALT+T调用检索鼠标位置的窗口句柄函数, CTRL+ALT+T结束该函数.
  5. Global $g_tStruct = DllStructCreate($tagPOINT) ; 检索鼠标位置的窗口句柄函数用。创建定义检查点的结构.该变量声明必须在主 While 循环之前。

  6. ;_WindowFromPoint()
  7. While 1
  8.         Sleep(100)
  9. WEnd


  10. Func _WindowFromPoint()          ;检索鼠标位置的窗口句柄.
  11.         While 1
  12.                 ToolTip("")
  13.                 Position() ; 更新鼠标 X 和 Y 坐标和结构的 X 和 Y 的元素.
  14.                 Local $hWnd = _WinAPI_WindowFromPoint($g_tStruct)  ;依据光标位置检索窗口句柄.
  15.                 Local $iID = _WinAPI_GetDlgCtrlID($hWnd)       ;依据句柄获 ID
  16.                 Local $sTitle = WinGetTitle($hWnd, "")         ;依据句柄获窗口标题
  17.                 Local $hWnd1 = WinGetHandle($hWnd, "")         ;依据句柄获窗口句柄
  18.                 Local $sPid = WinGetProcess($hWnd, '')         ;依据句柄获取窗口关联的进程 ID(PID).
  19.                 Local $Dir = _WinAPI_GetProcessFileName($sPid) ;检索指定进程可执行文件的完全有效路径(含文件名).
  20.                 $sTempText = '标题=' & $sTitle & @CRLF & '句柄 =' & $hWnd & @CRLF & '句柄1=' & $hWnd1 &  @CRLF & 'ID=' & $iID & @CRLF & '进程=' & $sPid & @CRLF & '路径=' & $Dir
  21.                 ToolTip($sTempText, Default, Default, '鼠标下的窗口句柄', 1 ,1)        ; 设置工具提示.
  22.                 Sleep(100)
  23.                 If _IsPressed("11") And _IsPressed("12") And _IsPressed("54")  Then    ;CTRL+ALT+T退出While循环
  24.                         ToolTip("")                                       ; 清除工具提示
  25.                         ExitLoop       ;ctrl+ PAUSE组合键退出while循环
  26.                 EndIf
  27.         WEnd
  28. EndFunc   ;==>_WindowFromPoint

  29. Func Position()
  30.         DllStructSetData($g_tStruct, "x", MouseGetPos(0))          ;MouseGetPos(0) = 当前鼠标的 X 坐标
  31.         DllStructSetData($g_tStruct, "y", MouseGetPos(1))          ;MouseGetPos(1) = 当前鼠标的 Y 坐标
  32. EndFunc   ;==>Position
复制代码
发表于 2015-1-19 15:10:03 | 显示全部楼层
本帖最后由 afan 于 2015-1-19 16:41 编辑
  1. #include <WinAPIEx.au3>

  2. HotKeySet('{esc}', '_Exit')
  3. HotKeySet('^!f', '_WindowFromPoint') ; 设置 CTRL+ALT+F调用检索鼠标位置的窗口句柄函数, CTRL+ALT+F结束该函数.
  4. Global $g_tStruct = DllStructCreate($tagPOINT) ; 检索鼠标位置的窗口句柄函数用。创建定义检查点的结构.该变量声明必须在主 While 循环之前。
  5. Global $SEFlag, $hWnd_Bak

  6. While 1
  7.         Sleep(100)
  8. WEnd

  9. Func _WindowFromPoint() ;检索鼠标位置的窗口句柄.
  10.         $SEFlag = Not $SEFlag
  11.         While $SEFlag
  12.                 Sleep(100)
  13.                 _Position() ; 更新鼠标 X 和 Y 坐标和结构的 X 和 Y 的元素.
  14.                 Local $hWnd = _WinAPI_WindowFromPoint($g_tStruct) ;依据光标位置检索窗口句柄.
  15.                 If $hWnd = $hWnd_Bak Then ContinueLoop
  16.                 $hWnd_Bak = $hWnd
  17.                 Local $iID = _WinAPI_GetDlgCtrlID($hWnd) ;依据句柄获 ID
  18.                 Local $sTitle = WinGetTitle($hWnd, '') ;依据句柄获窗口标题
  19.                 Local $hWnd1 = WinGetHandle($hWnd, '') ;依据句柄获窗口句柄
  20.                 Local $sPid = WinGetProcess($hWnd, '') ;依据句柄获取窗口关联的进程 ID(PID).
  21.                 Local $Dir = _WinAPI_GetProcessFileName($sPid) ;检索指定进程可执行文件的完全有效路径(含文件名).
  22.                 $sTempText = '标题=' & $sTitle & @CRLF & '句柄 =' & $hWnd & @CRLF & '句柄1=' & $hWnd1 & @CRLF & 'ID=' & $iID & @CRLF & '进程=' & $sPid & @CRLF & '路径=' & $Dir
  23.                 ToolTip($sTempText, Default, Default, '鼠标下的窗口句柄', 1, 1) ; 设置工具提示.
  24.         WEnd
  25. EndFunc   ;==>_WindowFromPoint

  26. Func _Position()
  27.         DllStructSetData($g_tStruct, 'x', MouseGetPos(0)) ;MouseGetPos(0) = 当前鼠标的 X 坐标
  28.         DllStructSetData($g_tStruct, 'y', MouseGetPos(1)) ;MouseGetPos(1) = 当前鼠标的 Y 坐标
  29. EndFunc   ;==>_Position

  30. Func _Exit()
  31.         Exit
  32. EndFunc   ;==>_Exit
复制代码
 楼主| 发表于 2015-1-19 16:33:05 | 显示全部楼层
本帖最后由 三八线 于 2015-1-19 16:34 编辑

回复 6# afan


    谢谢A大出手,高手出手就是不一样,不仅实现了同一快捷键既能调用也能结束自定义函数,还顺带解决了tooltip工具提示的闪烁问题。结下来就是理解A大代码的逻辑。再次谢谢A大!!,圆满结贴!
发表于 2015-1-19 16:43:53 | 显示全部楼层
回复 7# 三八线


    帖子修改了下,之前的 Sleep() 位置需要调整,放在循环的开始位置比较好,否则 CPU 占用会很高
 楼主| 发表于 2015-1-19 16:46:05 | 显示全部楼层
本帖最后由 三八线 于 2015-1-19 16:48 编辑

回复 6# afan


    禁不住请教A大,  $SEFlag = Not $SEFlag 该句该如何理解?,是咋实现的再次快捷键结束该函数?
发表于 2015-1-19 17:04:23 | 显示全部楼层
每调用一次 $SEFlag 的值就在 1 与 0 之间切换一次,之后是否继续下去的循环就是依据这个值 While $SEFlag
 楼主| 发表于 2015-1-19 18:37:12 | 显示全部楼层
回复 10# afan


    $SEFlag = Not $SEFlag  这样写竟有这样的作用,太神奇啦!谢谢A大!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2026-9-21 08:44 , Processed in 0.065759 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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