Что нового

[Мышь, клавиатура] Выполнять скрипт пока нажата клавиша.

whiskey

Новичок
Сообщения
5
Репутация
0
Может плохо искал... но не нашел нужной темы. Подскажите пожалуйста, каким образом можно проверить состояние клавиши (нажата или нет) в текущий момент времени.
Более наглядно вопрос выглядит так:

Код:
While 1
	While "пока нажата клавиша Ф1"
		Send ("{F1}")
		MouseClick("left")
	WEnd
	Sleep (100)
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
whiskey,
посмотрите функцию _IsPressed().
 
Автор
W

whiskey

Новичок
Сообщения
5
Репутация
0
madmasles сказал(а):
whiskey,
посмотрите функцию _IsPressed().
Не подходит... Эта функция возвращает результат когда "клавиша уже нажалась и отжалась", а мне надо чтобы функция работала когда "клавиша нажата". Я так понимаю нужно обращение к какой-то системной функции, что-то вроде KeyState() наверное, которая бы проверяла состояние клавиши... только опыта в программировании нет никакого... ну и соответственно не знаю как найти нужную дллку и функцию в ней.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
whiskey
Попробуйте так:
Код:
#include <Misc.au3>

Global $iKey_1 = "31", $iKey_2 = "32"

While 1
	If _IsPressed($iKey_1) Then ;1
		_MyFunc($iKey_1)
	EndIf
	If _IsPressed($iKey_2) Then ;2
		_MyFunc($iKey_2)
	EndIf
	If _IsPressed("33") Then ;3
		_MyExit()
	EndIf
	Sleep(100)
WEnd

Func _MyFunc($key)
	Local $i = 0, $j = 0
	While _IsPressed($key)
		$i += 1
		If $i = 10 Then
			$j += 1
			$i = 0
		EndIf
		TrayTip("_MyFunc", StringRight($key, 1) & ' Is Pressed ' & $j & ' sec.', 1, 17)
		Sleep(100)
	WEnd
	TrayTip("", "", 0)
EndFunc   ;==>_MyFunc

Func _MyExit()
	Exit
EndFunc   ;==>_MyExit
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 574
Репутация
335
whiskey [?]
Не подходит... Эта функция возвращает результат когда "клавиша уже нажалась и отжалась", а мне надо чтобы функция работала когда "клавиша нажата"
Не согласен. Попробуйте этот модифицированный код из справки:
Код:
#include <Misc.au3>

$dll = DllOpen("user32.dll")

While 1
	Sleep ( 250 )
	If _IsPressed("23", $dll) Then
		While _IsPressed("23", $dll)
			ConsoleWrite("1")
		WEnd
	ExitLoop
	EndIf
WEnd
DllClose($dll)
 
Автор
W

whiskey

Новичок
Сообщения
5
Репутация
0
Спасибо за ответы, действительно функция оказалась подходящей.
Выявил новую проблему) Собственно сам скрипт - простейший автокликер. Проблема в том, что при нажатии заданной клавиши скрипт посылает эту же самую клавишу... Из-за этого возникает пауза около секунды преждем чем кликер начинает посылать команды с задержкой, заданной в скрипте. Но думаю с этой проблемой разберусь самостоятельно)
Представленый ниже скрипт работает нормально (нажимаем и удерживаем q, сразу же начинает работать ф1 - клик)

Код:
#include <Misc.au3>

Global $key = "51"

HotKeySet("^!j", "Terminate")

$dll = DllOpen("user32.dll")
While 1
    While _IsPressed($key, $dll)
		Send("{F1}")
		MouseClick("left")
		Sleep(20)
    WEnd
	Sleep(100)
WEnd

Func Terminate()
	DllClose($dll)
    Exit 0
EndFunc
Еще раз всем спасибо за ответы.
 
Автор
W

whiskey

Новичок
Сообщения
5
Репутация
0
Нет, не могу победить я этот скрипт :wacko:
Есть предположение что нужно использовать функцию DllCall с дллкой user32.dll (возможно функции GetKeyState и GetAsyncKeyState), только никак не могу в них разобраться. Хотя они работают с виртуальными клавишами...
Возможно следует копать в направлении windows message codes, в частности функции WM_KEYDOWN/WM_KEYUP

Вобщем скрипт должен перехватывать и постоянно считывать физическое нажатие и удержание клавиши. И пока эта физическая клавиша нажата, он должен циклически "нажимать" виртуальный аналог этой клавиши. Причем надо каким-то образом обойти системный автоповтор...
 

DezmontDeXa

Новичок
Сообщения
23
Репутация
0
Re: [Мышь, клавиатура] Выполнять скрипт пока нажата клавиша

Здравствуйте! У меня вопрос по теме. Делаю себе софтварные макросы как на мышках Х7. Суть в том, что нужно при зажатии ЛКМ посылать не зажатие, а множественное протыкивание. Проблема в том, что при использовании в условии той же кнопки мыши, которую жмем, сразу после выполнения условие становится ложью.

Код:
if _IsPressed("01", $dll) then ; Если нажата ЛКМ
	  while _IsPressed("01", $dll) ;Пока нажата ЛКМ
		 MouseClick("left") ;Жмем и отпускаем ЛКМ, естественно цикл на этом и заканчивается.
                 Sleep(100) 
	 WEnd
endif
   EndIf


Что тут можно сделать? Использование другой клавиши - не вариант. Вызов MouseDown в конце цикла приводит к бесконечному циклу.
 

DezmontDeXa

Новичок
Сообщения
23
Репутация
0
Re: [Мышь, клавиатура] Выполнять скрипт пока нажата клавиша

Alofa сказал(а):
Вроде похоже на решение. Щас потестирую, спасибо)


Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
Не помогло. Может что-то не так делаю?
Код:
#include "MouseOnEvent.au3"
_MouseSetOnEvent_RI($MOUSE_PRIMARYDOWN_EVENT, '_Down_Event') ;Пробовал без RI -  ничего не изменилось
_MouseSetOnEvent_RI($MOUSE_SECONDARYDOWN_EVENT, '_Down_Event')

While 1
	Sleep(10)
WEnd

Func _Down_Event($iEvent)
	Switch $iEvent
		Case $MOUSE_PRIMARYDOWN_EVENT
			MouseClick("left")
		Case $MOUSE_SECONDARYDOWN_EVENT
			ToolTip('RBM')
	EndSwitch
EndFunc

Func _Quit()
	Exit
EndFunc
 
Верх