2017-12-14 39 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 1として

この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

非常に便利な投稿です。ありがとうございました。 –

関連する問題