Показать полную графическую версию : [решено] Эмуляции нажатия клавиш в неактивном окне
Доброго времени суток.
Необходим скрипт который будет удерживать/нажимать (в неактивном окне) клавишу. Имя процесса не меняется, изменяется лишь "Handle" заметил через AutoIt Window Info
Буду рад любой помощи
Примерно так:
ControlSend (http://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm)("Title", "", "", "{ShiftDown}")
А что если нужных процесса 2? Как не ошибиться в выборе?
А что если нужных процесса 2? »
Тогда нужна функция получения Handle окна по процессу:
$hWindow = _ProcessGetWindow("Proc.exe", 1)
ControlSend (http://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm)($hWindow, "", "Scintilla1", "{ShiftDown}")
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ProcessGetWindow($iPID, $iRet = -1)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aWinList = WinList (http://www.autoitscript.com/autoit3/docs/functions/WinList.htm)(), $aRet[2]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) IsString (http://www.autoitscript.com/autoit3/docs/functions/IsString.htm)($iPID) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iPID = ProcessExists (http://www.autoitscript.com/autoit3/docs/functions/ProcessExists.htm)($iPID)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aWinList)-1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)(WinGetState (http://www.autoitscript.com/autoit3/docs/functions/WinGetState.htm)($aWinList[$i][1]), 2) And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) WinGetProcess (http://www.autoitscript.com/autoit3/docs/functions/WinGetProcess.htm)($aWinList[$i][1]) = $iPID Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRet = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRet[0]
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRet = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRet[1]
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRet
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, $aRet)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Ковыряя код всё выглядит красиво, но вот не работает ничего. (даже кнопки рабочими сделать не могу)
Creat0R, поможешь еще раз? :pray:
Собственно вот что нужно..
http://s55.radikal.ru/i150/1101/19/bc0fad24f672.jpg
Думаю с окнами понятно, разве что хотелось бы указывание какое окно выбрано (Handle). А вот под "Старт" и "Стоп" залипание клавиши.
Реально такое оживить?
Думаю с окнами понятно »
Нет. Я вообще не понял что нужо делать.
хотелось бы указывание какое окно выбрано (Handle) »
Handle имеет свойство меняться (после перезапуска приложения), это уникальный идентификатор, на него полагаться нельзя (в смысле на тот что заранее “подсмотрен” в AutoIt Window Info).
Handle имеет свойство меняться (после перезапуска приложения) »
Но ведь и программу можно перезапустить. В дальнешем придется снова выбирать окно (тоже после перезапуска).
Хотя это уже не важно, можно обойтись.
Я вообще не понял что нужо делать. »
Прошу прощения. Мой мозг уже спит без меня.
1. Залипание клавиши.
Нажимаешь кнопку "старт" залипание включено (допустим клавиша f1), нажимаем "стоп" залипание клавиши выключено. Скрипт кнопок тоже нужен.
Можно такое слепить? :)
2. Выбор окна.
Нажимаем кнопку "окно" и используя этот код $hWindow = _ProcessGetWindow("Proc.exe", 1)
ControlSend($hWindow, "", "Scintilla1", "{ShiftDown}")
Func _ProcessGetWindow($iPID, $iRet = -1)
Local $aWinList = WinList(), $aRet[2]
If IsString($iPID) Then
$iPID = ProcessExists($iPID)
EndIf
For $i = 1 To UBound($aWinList)-1
If BitAND(WinGetState($aWinList[$i][1]), 2) And WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then
Return $aRet[0]
EndIf
If $iRet = 1 Then
Return $aRet[1]
EndIf
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc выбираем нужное нам окно в котором будет залипание клавиши.
Это самое сложное пожалуй.
С моими кривыми руками тут самому ничего не сделать...
Но ведь и программу можно перезапустить »
Я не понял, а как на счёт...
Имя процесса не меняется »
?
Нажимаешь кнопку "старт" залипание включено (допустим клавиша f1), нажимаем "стоп" залипание клавиши выключено »
Залипание в целом, или для выбранного окна?
Легче будет при каждом запуске скрипта указывать окно вручную, разумеется при помощи скрипта.
Залипание в целом, или для выбранного окна? »
Для выбранного окна
Неужели это не осуществить? Очень жаль...
Неужели это не осуществить? »
Осуществить, просто у меня пока нет времени на это, сорри :(.
у меня пока нет времени на это »
Ну чтож, буду ежедневно проверять тему :) надеюсь в недалеком будущем я найду тут нужный ответ.
Как кнопке
GUICtrlCreateButton ("text", 110, 140, 80)
дать команду допустим выключить утилиту?
ZARG-X, читать справку на тему GUI Concepts
kaster, Спасибо, разобрался.
Собственно появился следующий вопрос.
Opt("TrayMenuMode",1)
GUISetState()
$exit = TrayCreateItem("Выход")
While 1
Switch TrayGetMsg()
Case $exit
Exit
EndSwitch
WEnd
Выход из "программы" через трей работает, а как вернуть выход через крестик? Окно игнорирует клик.
ZARG-X, почитай весь раздел про создание GUI. там есть все, в том числе и выход из программ.
Если вкратце, то нужно мониторить простые системные сообщения посылаемые программе. Ты привел пример когда эти сообщения связанные с нажатием на кнопки в трее - TrayGetMsg(). Для элементов управления самого окна надо мониторить GUIGetMsg
kaster, :cry: можно кодом? уже столько вариантов пробовал... самое лучшее было когда тело программы не открывалось вообще, а в остальных случаях просто ругалось ошибкой
ZARG-X, мде...
$hGUI = GUICreate('GUI Для ленивых', 300, 200)
GUISetState()
Do
Until GUIGetMsg() = -3
Такое я уже делал, но мне нужно выход через крестик и в трее, вместе они не хотят работать.
Допустим этот код
$hGUI = GUICreate('GUI Для ленивых', 300, 200)
GUISetState()
Do
Until GUIGetMsg() = -3
Opt("TrayMenuMode",1)
GUISetState()
$exit = TrayCreateItem("Выход")
While 1
Switch TrayGetMsg()
Case $exit
Exit
EndSwitch
WEnd
ZARG-X, допустим? :o шутку оценил :lol:
помимо того, чтобы просто клеить разные скрипты, нужно их чуточку понимать. если на пальцах, то ты входишь в бесконечный цикл в котором непрерывно мониторишь состояние окна. а тот кусок который мониторит состояние трея никогда не достигается. какой напрашивается вывод - засунуть оба мониторинга в один бесконечный цикл
Opt("TrayMenuMode",1)
$hGUI = GUICreate('GUI Для ленивых', 300, 200)
GUISetState()
$exit = TrayCreateItem("Выход")
Do
Until GUIGetMsg() = -3 or TrayGetMsg() = $exit
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC