Что нового

MouseDown по одиночному нажатию _IsPressed("01")

Irlandec

Новичок
Сообщения
21
Репутация
0
Здраствуйте, цель такая: Одно нажатие левой кнопкой мыши ведет к зажатию левой кнопки мыши, ну и соответственно второе нажатие отпускает мышь.

InSimple:
if
_IsPressed("01") ;left button
then
Mousedown("left")
elseif
_Ispressed("01")
Mouseup("left")
endif

написал вот такой код:
Код:
#include <Misc.au3>
#include <MsgBoxConstants.au3>

While 1
$dll = DllOpen("user32.dll")
   sleep(500)
    If _IsPressed("01", $dll) Then
Mousedown("left")
  sleep(500)
    ElseIf _IsPressed("01", $dll) Then
MouseUp("left")
	 EndIf
	 sleep(500)
DllClose($dll)
WEnd



Подставлял вместо MouseDown вывод переменной в тултип, с тултипом всё работает... то есть сам то метод вроде работает, но что-то я делаю всё таки не так, подставлял вместо 01(нажатие левой кнопки мыши), "10"(шифт), но и с шифтом не пашет.
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Я пользовался библиотекой IsPressedEx.au3, все работало
http://autoit-script.ru/index.php?topic=4601.15
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Функции MouseUp / MouseDown эмулируют событие, а не удерживают состояние.


Вашу задачу можно решить следующим образом:
Код:
#Include <WinAPI.au3>

Local $hModule, $hHook, $_CbMouse, $fExit, $fPressed
; ---
$_CbMouse = DllCallbackRegister("__MouseHandler", "int", "int;ptr;ptr")

$hModule = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx( _
			$WH_MOUSE_LL, _
			DllCallbackGetPtr($_CbMouse), _
			$hModule _
		)

While Not $fExit And Sleep( 10 )
	WEnd

_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($_CbMouse)


Func __MouseHandler($iCode, $wParam, $lParam)
	Local $Ret = _WinAPI_CallNextHookEx( $hHook, $iCode, $wParam, $lParam )
	; -
	If $iCode = 0 Then ;HC_ACTION
		Switch $wParam
			Case 0x0201 ;WM_LBUTTONDOWN
				$fPressed = Not $fPressed

			Case 0x0202 ;WM_LBUTTONUP
				If $fPressed Then _
					Return 1

			Case 0x0204 ;WM_RBUTTONDOWN
				$fExit = True
		EndSwitch
	EndIf
	; ---
	Return $Ret
EndFunc
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
firex сказал(а):
Функции MouseUp / MouseDown эмулируют событие, а не удерживают состояние.


Вашу задачу можно решить следующим образом:

Код:
#Include <WinAPI.au3>

Local $hModule, $hHook, $_CbMouse, $fExit, $fPressed
; ---
$_CbMouse = DllCallbackRegister("__MouseHandler", "int", "int;ptr;ptr")

$hModule = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx( _
			$WH_MOUSE_LL, _
			DllCallbackGetPtr($_CbMouse), _
			$hModule _
		)

While Not $fExit And Sleep( 10 )
	WEnd

_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($_CbMouse)


Func __MouseHandler($iCode, $wParam, $lParam)
	Local $Ret = _WinAPI_CallNextHookEx( $hHook, $iCode, $wParam, $lParam )
	; -
	If $iCode = 0 Then ;HC_ACTION
		Switch $wParam
			Case 0x0201 ;WM_LBUTTONDOWN
				$fPressed = Not $fPressed

			Case 0x0202 ;WM_LBUTTONUP
				If $fPressed Then _
					Return 1

			Case 0x0204 ;WM_RBUTTONDOWN
				$fExit = True
		EndSwitch
	EndIf
	; ---
	Return $Ret
EndFunc

Спасибо большое, всё оказалось сложнее чем я думал.

P.S. На счет библиотеки _IspressedEx, у меня не получилось, видимо по той же причине которую назвал Firex
 
Верх