2017-12-14 7 views
0

Ich möchte MsgBox() auf Mausklick, aber verhindern natürliches Verhalten von Mausklick. Das heißt, wenn ich hier auf Stack Overflow auf irgendwelche Links klicke, muss meine aktive Seite gleich bleiben.Verhindern Standard-Aktion bei Mausklick

#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 

Antwort

2

Diese den Trick tun sollten:

#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; verhindern, dass es in der gleichen Zeit in der gleichen Weise ist & hellip;

Per MouseOnEvent UDF:

Diese UDF erlaubt ein Ereignis Handler für Maus-Gerät einzustellen.

Beispiel (ConsoleWrite() als MsgBox() Verwendung erfordert die geblockte Mausklick, um geschlossen zu werden):

#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 

Die UDF Ereignisse zu einem bestimmten Fenster als auch registriert werden kann. Es kann Ereignisse nach der Erkennung entweder blockieren oder weiterleiten und enthält Beispiele zur Einschränkung der Funktionalität auf Teile eines Bildschirms.

+0

Vielen Dank. Ich bin sehr neu in AutoIt und aus diesem Grund ist es sehr schwer zu entscheiden, welche von 2 Antworten besser ist. Aus diesem Grund habe ich im vorliegenden Moment die Antwort genehmigt, die keine UDF benötigt, aber - Ihre Antwort ist wahrscheinlich besser und ich werde sie in Zukunft noch einmal annehmen. –

+1

@ johnc.j. Deine Frage, deine Wahl; Beide Lösungen erreichen das gleiche Ergebnis mit genau den gleichen Methoden (ohne UDF müssen Sie verstehen, wie es funktioniert, die Funktionalität zu ändern). [Verwandte] (https://Stackoverflow.com/a/9478844/4157124). – user4157124

+0

Sehr nützliche Post. Danke nochmal. –

Verwandte Themen