#Region - TimeStamp
; 2013-03-09 19:42:54   v 0.1
#EndRegion - TimeStamp

#include-once
#include <WinAPI.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister('OnAutoItExit')

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)

Func _MouseProc($nCode, $wParam, $lParam)
    If ($nCode < 0) Or ($nCode <> $HC_ACTION) Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $wParam = $WM_LBUTTONUP Then __GUI_DoubleClick_MouseUp()
	Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
EndFunc



Global $__aDblClkCtrl[1][3] = [[0]]   ; [0][0]=Anzahl Ctrl, [[GUI-Hwnd,Control-ID,Dummy-ID]]

;===============================================================================
; Function Name....: _GUI_DoubleClick_Register
; Description......: Registriert ein Control auf einer GUI für Doppelklick-Event
; .................: und gibt eine Ctrl-ID zurück die bei Doppelklick befeuert wird.
; .................: Abfragbar über GuiGetMsg() und GuiCtrlSetOnEvent()
; Parameter(s).....: $_hGui   GUI-Handle, auf dem das Control sich befindet
; .................: $_cCtrl  Control für das Doppelklicks abgefragt werden sollen
; Requirement(s)...: none
; Return Value(s)..: Erfolg:   Dummy-Ctrl, das bei Doppelklick ausgelöst wird
; .................: Fehler:   "0"   set @error =1  bereits registriert
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _GUI_DoubleClick_Register($_hGui, $_cCtrl)
	Local $iRegHwnd = 0, $iRegCtrl = 0
	If $__aDblClkCtrl[0][0] > 0 Then
		For $i = 1 To $__aDblClkCtrl[0][0]
			If $__aDblClkCtrl[$i][0] = $_hGui Then $iRegHwnd = 1
			If $__aDblClkCtrl[$i][0] = $_hGui And $__aDblClkCtrl[$i][1] = $_cCtrl Then $iRegCtrl = 1
		Next
	EndIf
	If $iRegHwnd = 1 And $iRegCtrl = 1 Then Return SetError(1,0,0)
	$__aDblClkCtrl[0][0] += 1
	ReDim $__aDblClkCtrl[$__aDblClkCtrl[0][0] +1][3]
	$__aDblClkCtrl[$__aDblClkCtrl[0][0]][0] = $_hGui
	$__aDblClkCtrl[$__aDblClkCtrl[0][0]][1] = $_cCtrl
	Local $hPrevious = GUISwitch($_hGui)
	Local $iID = GUICtrlCreateDummy()
	$__aDblClkCtrl[$__aDblClkCtrl[0][0]][2] = $iID
	GUISwitch($hPrevious)
	Return $iID
EndFunc  ;==>_GUI_DoubleClick_Register


Func __GUI_DoubleClick_MouseUp()
	Local Static $iDblClickSpeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
	Local Static $iClickDown = 0, $iTime, $iCtrlSingle
	Local $iClicked = 0
	Local $hWndCurr = WinGetHandle(WinGetTitle("[ACTIVE]"))
	If @error Then Return $iClickDown = 0
	Local $aInfo = GUIGetCursorInfo($hWndCurr)
	If @error Then Return $iClickDown = 0
	For $i = 1 To $__aDblClkCtrl[0][0]
		If $__aDblClkCtrl[$i][0] = $hWndCurr And $__aDblClkCtrl[$i][1] = $aInfo[4] Then
			$iClicked = $i
			ExitLoop
		EndIf
	Next
	If $iClicked = 0 Then Return $iClickDown = 0
	$iClickDown += 1
	If $iClickDown = 1 Then
		$iTime = TimerInit()
		$iCtrlSingle = $aInfo[4]
	Else
		If ($iCtrlSingle <> $aInfo[4]) Or (TimerDiff($iTime) >= $iDblClickSpeed) Then
			$iTime = TimerInit()
			$iCtrlSingle = $aInfo[4]
			Return $iClickDown = 1
		EndIf
		If TimerDiff($iTime) <= $iDblClickSpeed Then _
			DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $__aDblClkCtrl[$iClicked][0], "uint", 273, "wparam", $__aDblClkCtrl[$iClicked][2], "lparam", 0)
		$iClickDown = 0
	EndIf
EndFunc  ;==>__GUI_DoubleClick_MouseUp



