Что нового

APPCRASH при разблокировке мыши

vovsla

Осваивающий
Сообщения
607
Репутация
36
Есть 2 скрипта. В скрипте №1 никаких проблем не возникает. А в скрипте №2 если двигать мышкой в то время блокировки, то при разблокировке мыши скрипт крашится. Что не так во втором скрипте?

Скрипит №1
Код:
#include <WinAPI.au3>

Global $hHook_Mouse, $hStub_MouseProc


LockMouse()

Sleep(5000)

UnlockMouse()

While Sleep(100)
WEnd


Func LockMouse()
	$hStub_MouseProc = DllCallbackRegister("MouseProc", "long", "int;wparam;lparam")
	$hHook_Mouse = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), _WinAPI_GetModuleHandle(0))
EndFunc


Func MouseProc($nCode, $wParam, $lParam)
  Return 1
EndFunc

Func UnlockMouse()
  _WinAPI_UnhookWindowsHookEx($hHook_Mouse)
  DllCallbackFree($hStub_MouseProc)
EndFunc


Скрипит №2
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Global $Starting=False, $hStub_MouseProc, $hHook_Mouse



AdlibRegister('ControlExist', 500)


While Sleep(100)
WEnd

Func ControlExist()
	If Not ProcessExists('notepad.exe') And $Starting=False Then
		LockMouse()
		$Starting=True
		Run(@ComSpec&' start cmd /c notepad.exe')
	ElseIf ProcessExists('notepad.exe') And $Starting=True Then
		$Starting=False
		UnlockMouse()
	EndIf
EndFunc

Func LockMouse()
	ConsoleWrite('LockMouse'&@CRLF)
	$hStub_MouseProc = DllCallbackRegister("MouseProc", "long", "int;wparam;lparam")
	$hHook_Mouse = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), _WinAPI_GetModuleHandle(0))
EndFunc

Func UnlockMouse()
	ConsoleWrite('UnlockMouse'&@CRLF)
	_WinAPI_UnhookWindowsHookEx($hHook_Mouse)
	DllCallbackFree($hStub_MouseProc)
EndFunc

Func MouseProc($nCode, $wParam, $lParam)
  Return 1
EndFunc


Код:
Сигнатура проблемы:
  Имя события проблемы:	APPCRASH
  Имя приложения:	autoit3.exe
  Версия приложения:	3.3.10.2
  Отметка времени приложения:	52c196bd
  Имя модуля с ошибкой:	StackHash_0a9e
  Версия модуля с ошибкой:	0.0.0.0
  Отметка времени модуля с ошибкой:	00000000
  Код исключения:	c0000005
  Смещение исключения:	00180057
  Версия ОС:	6.1.7601.2.1.0.256.1
  Код языка:	1049
  Дополнительные сведения 1:	0a9e
  Дополнительные сведения 2:	0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:	0a9e
  Дополнительные сведения 4:	0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Vovsla
Что не так во втором скрипте?
Скорее всего проблема в AdlibRegister(), потому что после переноса тела функции в главный цикл "падения" скрипта прекращаются
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Global $Starting=False, $hStub_MouseProc, $hHook_Mouse

;~ AdlibRegister('ControlExist', 500)

While Sleep(500)
    If Not ProcessExists('notepad.exe') And $Starting=False Then
        LockMouse()
        $Starting=True
        Run(@ComSpec&' start cmd /c notepad.exe')
    ElseIf ProcessExists('notepad.exe') And $Starting=True Then
        $Starting=False
        UnlockMouse()
    EndIf
WEnd

;~ Func ControlExist()
;~     If Not ProcessExists('notepad.exe') And $Starting=False Then
;~         LockMouse()
;~         $Starting=True
;~         Run(@ComSpec&' start cmd /c notepad.exe')
;~     ElseIf ProcessExists('notepad.exe') And $Starting=True Then
;~         $Starting=False
;~         UnlockMouse()
;~     EndIf
;~ EndFunc

Func LockMouse()
    ConsoleWrite('LockMouse'&@CRLF)
    $hStub_MouseProc = DllCallbackRegister("MouseProc", "long", "int;wparam;lparam")
    $hHook_Mouse = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), _WinAPI_GetModuleHandle(0))
EndFunc

Func UnlockMouse()
    ConsoleWrite('UnlockMouse'&@CRLF)
    _WinAPI_UnhookWindowsHookEx($hHook_Mouse)
    DllCallbackFree($hStub_MouseProc)
EndFunc

Func MouseProc($nCode, $wParam, $lParam)
    Return 1
EndFunc
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Я об этом догадывался. Но мне нужно оставить AdlibRegister. Что в таком случае можно предпринять?
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Спасибо за совет. По большому счету мне нужен был не AdlibRegister, а постоянный мониторинг.
Для постоянного мониторинга из AdlibRegister переместил все в While - Wend. Теперь все ОК
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Нужно проверять что в DllCallbackFree передаётся указатель:

Код:
Func UnlockMouse()
    ConsoleWrite('UnlockMouse'&@CRLF)
    If $hHook_Mouse Then
        _WinAPI_UnhookWindowsHookEx($hHook_Mouse)
    EndIf
    
    If $hStub_MouseProc Then
        DllCallbackFree($hStub_MouseProc)
    EndIf
EndFunc
 
Верх