Что нового

[Мышь, клавиатура] Скрипт меняющий комбинацию нажатых клавиш на другую клавишу

xzspb

Новичок
Сообщения
7
Репутация
0
Здравствуйте, задача довольно простая - написать скрипт делающий следующее:

Если активно окно, то при нажатии комбинации клавиш получать другие клавиши:

Shift D = Num5 например
Shift E = Num8
итд

Не очень понял - можно ли скрипт повесить в трее, чтобы он постоянно работал?
Нужно использовать HotKeySet?

То, чудо которое я написал хотя бы правильно? Просто я ее скомпилировал - запустил и в трее она не появляется.. Подскажите слабаку как действовать?
Код:
HotKeySet("+d", "lol")

Func lol()
	send("{Numpad5}")
EndFunc


При этом будет ли он отсылать Shift?

Нужно обязательно чтобы происходило следующее:

1) Нажат шифт
2) Как только нажимается к нему D (shift D) отсылается клавиша Num5 и клавиши считаются отжатыми.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Мышь, клавиатура] Хоткеи

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Мышь, клавиатура] Хоткеи" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
X

xzspb

Новичок
Сообщения
7
Репутация
0
Извиняюсь, думал что хоткеи это всем известное понятие.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
HotKeySet("{ESC}", "_Exit")

HotKeySet("+d", "lol")

While 1
	Sleep(100)
WEnd

Func lol()
    send("{Numpad5}")
EndFunc

Func _Exit()
    Exit 0
EndFunc
 
Автор
X

xzspb

Новичок
Сообщения
7
Репутация
0
Что то я вообще не понял части кода :'(

Зачем здесь ESC? И что за цикл с while, откуда он берет переменную и зачем. :-[

Подскажите как сделать скрипт активным только тогда когда окно активно, например блокнота?
Или добавить флаг (1|0) - включения выключения скрипта? То есть чтобы он висел в трее и был неактивен/активен
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Не очень понял - можно ли скрипт повесить в трее, чтобы он постоянно работал?
Чтобы скрипт работал и висел в трее - необходимо, чтобы программа никогда не завершалась - правильно ???

Другими словами необходимо в коде программы написать какой-либо цикл в "бесконечность" - логично ?

Код:
HotKeySet("{ESC}", "_Exit") ; Присваеваем кл. ESC функцию "_Exit"

HotKeySet("+d", "lol")		; Присваеваем кл. Shift+d функцию "lol"

While 1						; Бесконечный цикл - чтобы программа работала и висела в трее
    Sleep(100)				; Пауза в скрипте на 100 миллисек
WEnd						; Ну здесь как бы завершаем бесконечный цикл

Func lol()					; Определяем функцию "lol"
    send("{Numpad5}")		; Отправляем клавишу Numpad5
EndFunc						; Завершаем функцию

Func _Exit()				; Определяем функцию "_Exit"
    Exit 0					; Завершает выполнение скрипта
EndFunc						; Завершаем функцию


PS: Можешь ESC выключить - тогда будешь выходить из программы через ПКМ в трее на скрипте или же через "taskmgr".
PSS: в самом низу страницы есть "Похожие темы". Пауза в скрипте - попробуй по поиску... было такое.
 
Автор
X

xzspb

Новичок
Сообщения
7
Репутация
0
Спасибо за пояснение.
Как лучше сделать определение активного окна? Чтобы скрипт работал только когда оно активно?
 

f_ckerfox

Новичок
Сообщения
3
Репутация
0
Думаю, для этого проще всего WinWaitActive использовать.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
HotKeySet("{ESC}", "_Exit") ; Присваеваем кл. ESC функцию "_Exit"

While 1                     ; Бесконечный цикл - чтобы программа работала и висела в трее
    If WinActive("[CLASS:Notepad]") Then 	; Проверяем активно ли онко или нет
		HotKeySet("+d", "lol") 				; Присваеваем кл. Shift+d функцию "lol"
	Else									; Если окно не активно
		HotKeySet("+d") 					; Скидываем кл. Shift+d на "по-умолчанию"
		Sleep(100)
	EndIf
WEnd                        ; Ну здесь как бы завершаем бесконечный цикл

Func lol()                  ; Определяем функцию "lol"
    send("{Numpad5}")       ; Отправляем клавишу Numpad5
EndFunc                     ; Завершаем функцию

Func _Exit()                ; Определяем функцию "_Exit"
    Exit 0                  ; Завершает выполнение скрипта
EndFunc                     ; Завершаем функцию

ЗЫ: исправил чуть-чуть... ЦП будет спокойней себя чувствовать, когда находится НЕ в блокноте.
Проблемы: Если Sleep убрать, то загразка ЦП будет внушать доверие в работе скрипта. А если поставить Sleep - то при открытии блокнота и удержании "Shift+d" будет иногда проскакивать символ "d". ИМХО: а здесь как бы оптимально...
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Можно использовать функции из UDF HotKey

http://autoit-script.ru/index.php/topic,296.0.html

Код:
#include <HotKey.au3>

Global Const $VK_OEM_D = 0x44 ; D
Global Const $VK_OEM_Esc = 0x1B ; Esc

$Form = WinGetHandle('окно','') ; заголовок окна

_HotKeyAssign(BitOR($CK_SHIFT, $VK_OEM_D), '_lol', 0, $Form)
_HotKeyAssign($VK_OEM_Esc, '_Exit')

While 1                    
    Sleep(60)              
WEnd  

Func _lol()                 
   send("{Numpad5}")
EndFunc 

Func _Exit()
    Exit 
EndFunc


В данном случае выход работает при любом состоянии нужного окна, а функция _lol() при его активности.
 
Автор
X

xzspb

Новичок
Сообщения
7
Репутация
0
В результате сделал такой.

Код:
HotKeySet("+"&"{?}", "_Exit") ; Присваеваем кл. ESC функцию "_Exit"

While 1                     ; Бесконечный цикл - чтобы программа работала и висела в трее
    If WinActive("[CLASS:Valve001]") Then    ; Проверяем активно ли онко или нет
        HotKeySet("+e", "shifte")              ; Присваеваем кл. Shift+e функцию
		HotKeySet("+s", "shifts")              ; Присваеваем кл. Shift+s функцию
		HotKeySet("+d", "shiftd")              ; Присваеваем кл. Shift+d функцию
    Else                                    ; Если окно не активно
        HotKeySet("+e")                     ; Скидываем кл. Shift+d на "по-умолчанию"
		HotKeySet("+s")                     ; Скидываем кл. Shift+d на "по-умолчанию"
		HotKeySet("+d")                     ; Скидываем кл. Shift+d на "по-умолчанию"
        Sleep(100)
    EndIf
WEnd                        ; Ну здесь как бы завершаем бесконечный цикл

Func shifte()                  ; Определяем функцию "shifte"
    send("{Numpad5}")       ; Отправляем клавишу Numpad5
EndFunc                     ; Завершаем функцию

Func shifts()                  ; Определяем функцию "shifts"
    send("{Numpad7}")       ; Отправляем клавишу Numpad5
EndFunc

Func shiftd()                 ; Определяем функцию "shiftd"
    send("{Numpad4}")       ; Отправляем клавишу Numpad5
EndFunc

Func _Exit()                ; Определяем функцию "_Exit"
   MsgBox(0, "DotaHotkeys", "Script is off")
   Exit 0                  ; Завершает выполнение скрипта
EndFunc                     ; Завершаем функцию
 
Верх