找回密码  加入

AUTOIT CN

搜索
查看: 116|回复: 2

WM_COMMAND不能与钩子$WH_MOUSE_LL配合使用吗?

[复制链接]
发表于 2022-1-9 11:37:59 | 显示全部楼层 |阅读模式
如下大部代码摘自本论坛,消息循环用while 1可正常运行,用 GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")  就卡死,是WM_COMMAND不能与钩子$WH_MOUSE_LL配合使用吗?
  1. <div class="blockcode"><blockquote>#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
  2. #AutoIt3Wrapper_Icon=whx-ocr-32.ico
  3. #AutoIt3Wrapper_Outfile_x64=OCRwhx.exe
  4. #AutoIt3Wrapper_UseUpx=y
  5. #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
  6. ;~ #AutoIt3Wrapper_Res_Icon_Add=@script\logo.ico
  7. #include <GDIPlus.au3>
  8. #include <GuiStatusBar.au3>
  9. #include <WindowsConstants.au3>
  10. #include <StructureConstants.au3>
  11. ;~ #include <GUIConstants.au3>
  12. #include <GUIConstantsEx.au3>
  13. #include <Constants.au3>
  14. #include <EditConstants.au3>
  15. #include <StructureConstants.au3>
  16. ;~ #include <Memory.au3>
  17. #include <Clipboard.au3>
  18. #include <WinAPI.au3>
  19. ;~ #include <ScreenCapture.au3>

  20. ;~ Opt("GUIOnEventMode", 1) ;使用事件模式

  21. Global $gForm_title = "OCR_Capture V1.0"

  22. Global _
  23.                 $A = 0, $_B = 0, $C = 0, $D = 0
  24. Global $HHook, $WM_LBUTTON_TEST = 0, $START_X, $START_Y, $MouseGui, _
  25.                 $LF_RI_SIZE = 0, $TO_BO_SIZE = 0, $IMGE_L = 0, $IMGE_T = 0, $IMGE_W = 0 _
  26.                 , $IMGE_H = 0, $hBitmap
  27. Global $GUI

  28. $GUI = GUICreate($gForm_title, 400, 320)
  29. $Button_cap = GUICtrlCreateButton("开始截图", 10, 50, 100, 30)
  30. ;~ =====================================================================================================
  31. _GDIPlus_Startup()
  32. GUISetState()
  33. ;~ =====================================================================================================
  34. ;~ =====================================================================================================
  35. ;~ Local $iMsg
  36. ;~ While 1
  37. ;~         $iMsg = GUIGetMsg()

  38. ;~         Switch $iMsg
  39. ;~                 Case $GUI_EVENT_CLOSE
  40. ;~                         ExitLoop
  41. ;~                 Case $Button_cap
  42. ;~                         ;~ ConsoleWrite("----------46-------$Msg-----" & @TAB & $iMsg & @CRLF)
  43. ;~                         If ($hBitmap) Then _WinAPI_DeleteObject($hBitmap)
  44. ;~                                 Mouse_Capture($GUI)
  45. ;~         EndSwitch
  46. ;~ WEnd
  47. ;~ =====================================================================================================

  48. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
  49. Do
  50. Until GUIGetMsg() = -3

  51. ;~ =====================================================================================================
  52. _GDIPlus_Shutdown()
  53. GUIDelete()
  54. ;~ =====================================================================================================

  55. Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  56.         Local $iControl = BitAND($wParam, 0x0000FFFF)
  57.         Local $hCtrl = $lParam

  58.         Switch $hWnd
  59.                 Case $GUI
  60.                         Switch $iControl
  61.                                 Case $Button_cap
  62.                                         ;~ ConsoleWrite("----------67-------$Button_cap-----" & @TAB & $Button_cap & @CRLF)
  63.                                         If ($hBitmap) Then _WinAPI_DeleteObject($hBitmap)
  64.                                                 Mouse_Capture($GUI)
  65.                                 Case $GUI_EVENT_CLOSE
  66.                                         Exit
  67.                         EndSwitch
  68.         EndSwitch
  69.         Return $GUI_RUNDEFMSG
  70. EndFunc   ;==>WM_COMMAND

  71. ;~ =====================================================================================================
  72. Func Mouse_Capture($GUI = 0, $BORDER_LF_RI_SIZE = 3, $BORDER_TO_BO_SIZE = 3, $BORDCOLOR = 0xFF0000)
  73.         $LF_RI_SIZE = $BORDER_LF_RI_SIZE ;Global $LF_RI_SIZE,$TO_BO_SIZE
  74.         $TO_BO_SIZE = $BORDER_TO_BO_SIZE ;Global $LF_RI_SIZE,$TO_BO_SIZE
  75.         If $GUI <> 0 Then GUISetState(@SW_HIDE, $GUI)
  76.         $MouseGui = GUICreate("", 1, 1, 1, 1, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS), _
  77.                         BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
  78.         GUISetBkColor($BORDCOLOR, $MouseGui)
  79.         $RegMouseProc = DllCallbackRegister("LowLevelMouseProc", "long", "int;wparam;lparam")
  80.         $HMod = _WinAPI_GetModuleHandle(0)
  81.         $HHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($RegMouseProc), $HMod)
  82.         While 1
  83.                 If $WM_LBUTTON_TEST = 2 Then
  84.                         $hBitmap = BitmapCreate()
  85.                         If $GUI <> 0 Then GUISetState(@SW_SHOW, $GUI)
  86.                         If $GUI <> 0 Then GUISwitch($GUI)
  87.                         _WinAPI_UnhookWindowsHookEx($HHook)
  88.                         DllCallbackFree($RegMouseProc)
  89.                         $WM_LBUTTON_TEST = 0
  90.                         ExitLoop
  91.                 EndIf
  92.         WEnd
  93.         Return $hBitmap
  94. EndFunc   ;==>Mouse_Capture

  95. Func LowLevelMouseProc($nCode, $wParam, $lParam)
  96.         If $nCode < 0 Then _
  97.                         Return _WinAPI_CallNextHookEx($HHook, $nCode, $wParam, $lParam)
  98.         Select
  99.                 Case $wParam == $WM_LBUTTONDOWN And $WM_LBUTTON_TEST = 0
  100.                         $POINT = DllStructCreate($tagPOINT, $lParam)
  101.                         $START_X = DllStructGetData($POINT, 1)
  102.                         $START_Y = DllStructGetData($POINT, 2)
  103.                         $WM_LBUTTON_TEST = 1
  104.                         Return 1
  105.                 Case $wParam == $WM_MOUSEMOVE And $WM_LBUTTON_TEST = 1
  106.                         $POINT = DllStructCreate($tagPOINT, $lParam)
  107.                         $MOVE_X = DllStructGetData($POINT, 1)
  108.                         $MOVE_Y = DllStructGetData($POINT, 2)
  109.                         If $START_X >= $MOVE_X Then
  110.                                 $L = $MOVE_X
  111.                                 $R = $START_X
  112.                         Else
  113.                                 $R = $MOVE_X
  114.                                 $L = $START_X
  115.                         EndIf
  116.                         If $START_Y >= $MOVE_Y Then
  117.                                 $B = $START_Y
  118.                                 $T = $MOVE_Y
  119.                         Else
  120.                                 $T = $START_Y
  121.                                 $B = $MOVE_Y
  122.                         EndIf
  123.                         $W = $R - $L
  124.                         $H = $B - $T
  125.                         ;Global $IMGE_L = 0 , $IMGE_T = 0,$IMGE_W = 0 _$IMGE_H = 0
  126.                         Global $IMGE_L = ($L + $LF_RI_SIZE), $IMGE_T = ($T + $TO_BO_SIZE), $IMGE_W = $W, $IMGE_H = $H
  127.                         DrawGuiRgn($LF_RI_SIZE, $TO_BO_SIZE, $W, $H, $L, $T) ;Global $LF_RI_SIZE $TO_BO_SIZE
  128.                 Case $wParam == $WM_LBUTTONUP And $WM_LBUTTON_TEST = 1
  129.                         GUIDelete($MouseGui)
  130.                         $WM_LBUTTON_TEST = 2
  131.                         Return 1
  132.         EndSelect
  133.         Return _WinAPI_CallNextHookEx($HHook, $nCode, $wParam, $lParam)
  134. EndFunc   ;==>LowLevelMouseProc

  135. Func DrawGuiRgn($BORDER_LF_RI_SIZE, $BORDER_TO_BO_SIZE, $WIDTH, $HEIGHT, $LEFT, $TOP)
  136.         $W = $BORDER_LF_RI_SIZE * 2 + $WIDTH
  137.         $H = $BORDER_TO_BO_SIZE * 2 + $HEIGHT
  138.         _WinAPI_SetWindowPos($MouseGui, 0, $LEFT, $TOP, $LEFT + $W, $TOP + $H, 0)
  139.         Sleep(20)
  140.         $hREG1 = _WinAPI_CreateRectRgn(0, 0, $W, $H)
  141.         $hREG2 = _WinAPI_CreateRectRgn($BORDER_LF_RI_SIZE, $BORDER_TO_BO_SIZE, $BORDER_LF_RI_SIZE + $WIDTH, $BORDER_TO_BO_SIZE + $HEIGHT)
  142.         $hREG3 = _WinAPI_CreateRectRgn(0, 0, 0, 0)
  143.         _WinAPI_CombineRgn($hREG3, $hREG1, $hREG2, $RGN_DIFF)
  144.         _WinAPI_DeleteObject($hREG1)
  145.         _WinAPI_DeleteObject($hREG2)
  146.         _WinAPI_SetWindowRgn($MouseGui, $hREG3)
  147.         _WinAPI_DeleteObject($hREG3)
  148.         GUISetState(@SW_SHOW, $MouseGui)
  149. EndFunc   ;==>DrawGuiRgn


  150. Func BitmapCreate()
  151.         $DC = _WinAPI_GetDC(0)
  152.         $CompatibleDC = _WinAPI_CreateCompatibleDC($DC)
  153.         $hBitmap = _WinAPI_CreateCompatibleBitmap($DC, $IMGE_W, $IMGE_H)
  154.         _WinAPI_SelectObject($CompatibleDC, $hBitmap)
  155.         _WinAPI_BitBlt($CompatibleDC, 0, 0, $IMGE_W, $IMGE_H, $DC, $IMGE_L, $IMGE_T, $SRCCOPY)

  156.         Return $hBitmap
  157. EndFunc   ;==>BitmapCreate

复制代码


发表于 2022-1-10 07:45:07 | 显示全部楼层
注册的消息你得让它及时返回。
Mouse_Capture中的while循环去掉,改成 AdlibRegister('_WaitMsg')试试

Func _WaitMsg()
        If $WM_LBUTTON_TEST = 2 Then
                $hBitmap = BitmapCreate()
                If $GUI <> 0 Then GUISetState(@SW_SHOW, $GUI)
                If $GUI <> 0 Then GUISwitch($GUI)
                _WinAPI_UnhookWindowsHookEx($HHook)
                DllCallbackFree($RegMouseProc)
                $WM_LBUTTON_TEST = 0
        EndIf       
EndFunc   ;==>_WaitMsg
 楼主| 发表于 2022-1-11 09:18:32 | 显示全部楼层
haijie1223 发表于 2022-1-10 07:45
注册的消息你得让它及时返回。
Mouse_Capture中的while循环去掉,改成 AdlibRegister('_WaitMsg')试试

谢谢, 因要循环中断后返回图像句柄,我看看要咋改一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2022-1-28 04:58 , Processed in 0.171875 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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