2017-12-14 33 views
0

마우스 클릭시 MsgBox()을 원하지만 마우스 클릭의 자연스러운 동작을 방지합니다. 스택 오버플로에서 링크를 클릭하면 활성 페이지가 동일하게 유지되어야합니다. 이 트릭해야마우스 클릭시 기본 동작 방지

#include <MsgBoxConstants.au3> 
#Include <Misc.au3> 

While 1 
    If _IsPressed(01) Then ShowAlert() ; 01 is for left mouse button 
    Sleep (100) 
WEnd 

Func ShowAlert() 
    MsgBox($MB_SYSTEMMODAL, "", "Test") 
EndFunc 

답변

2

:

#include <Constants.au3> 
#include <WinAPI.au3> 
#include <WindowsConstants.au3> 

Global Const $HC_ACTION = 0 
Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam") 
Global $hmod = _WinAPI_GetModuleHandle(0) 
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod) 

HotKeySet('^+!e', '_ende') ; CTRL+SHIFT+ALT+E to exit. 
OnAutoItExitRegister('ExitFunc') 

While 1 
    Sleep(100) 
WEnd 

Func _ende() 
    Exit 
EndFunc ;==>_ende 

Func _MouseProc($nCode, $wParam, $lParam) 
    If $nCode < 0 Then 
     Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) 
    EndIf 
    If $nCode = $HC_ACTION Then 
     Switch $wParam 
      Case 0x0201 
       ConsoleWrite('No Click!' & @CRLF) 
       Return -1 
;~   Case $WM_MBUTTONUP 
;~    Return _mouse_event($MOUSEEVENTF_RIGHTUP) ; Returns -1; mouse click will be ignored. 
     EndSwitch 
    EndIf 
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) 
EndFunc ;==>_MouseProc 

Func ExitFunc() 
    _WinAPI_UnhookWindowsHookEx($hHook) 
    DllCallbackFree($hStub_MouseProc) 
EndFunc ;==>ExitFunc 

Func _mouse_event($dwFlags) 
    DllCall("user32", 'long', 'mouse_event', 'long', $dwFlags, 'long', 0, 'long', 0, 'long', 0, 'long', 0) 
    Return -1 
EndFunc ;==>_mouse_event 
1

중 & hellip을; 같은 시간에 자연스러운 동작을 방지하고 도약; MouseOnEvent UDF 당으로

:

이 UDF는 마우스 장치에 대한 이벤트 핸들러를 설정할 수 있습니다.

예 (MsgBox()ConsoleWrite()를 사용하여이이 버튼을 클릭 마우스를 위해하는 것은 닫아야 차단 된 필요) :

#include "MouseOnEvent.au3" 

Global Const $g_sKeyQuit = '{esc}' 
Global Const $g_iDelay  = 10 
Global Const $g_bBlockInput = True 

Global  $g_bStateQuit = False 

Main() 

Func Main() 
    HotKeySet($g_sKeyQuit, 'Quit') 
    _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_MousePrimaryDown_Event') 
    _MouseSetOnEvent($MOUSE_PRIMARYDBLCLK_EVENT, '_MousePrimaryDblclk_Event') 

    While Not $g_bStateQuit 
     Sleep($g_iDelay) 
    WEnd 

    Exit 
EndFunc 

Func Quit() 
    $g_bStateQuit = True 
EndFunc 

Func _MousePrimaryDown_Event() 
    ConsoleWrite('Detected $MOUSE_PRIMARYDOWN_EVENT' & @CRLF) 
    Return $g_bBlockInput ? $MOE_BLOCKDEFPROC : $MOE_RUNDEFPROC 
EndFunc 

Func _MousePrimaryDblclk_Event() 
    ConsoleWrite('Detected $MOUSE_PRIMARYDBLCLK_EVENT' & @CRLF) 
    Return $g_bBlockInput ? $MOE_BLOCKDEFPROC : $MOE_RUNDEFPROC 
EndFunc 

UDF를 이벤트뿐만 아니라 특정 창에 등록 할 수 있습니다. 탐지 후 이벤트를 차단하거나 전달할 수 있으며 기능을 화면의 일부로 제한하는 방법에 대한 예가 포함됩니다.

+0

대단히 감사합니다. 나는 AutoIt에서 매우 새롭다. 그리고 그 이유에 의해, 2 가지 대답 중 어느 것이 더 나은지를 결정하는 것은 매우 어렵다. 그래서 지금 현재로서는 UDF가 필요없는 대답을 승인했지만 그 대답은 아마도 더 좋을 것이며 앞으로는 다시 인정할 것입니다. –

+1

@ johnc.j. 당신의 질문, 당신의 선택; 두 가지 솔루션 모두 정확히 동일한 방법을 사용하여 동일한 결과를 얻을 수 있습니다 (UDF 없이는 기능 변경 방법을 이해해야합니다). [관련] (https://stackoverflow.com/a/9478844/4157124). – user4157124

+0

매우 유용한 게시물입니다. 다시 감사합니다. –