Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Эмуляции нажатия клавиш в неактивном окне (http://forum.oszone.net/showthread.php?t=195725)

ZARG-X 04-01-2011 18:37 1580646

Эмуляции нажатия клавиш в неактивном окне
 
Доброго времени суток.

Необходим скрипт который будет удерживать/нажимать (в неактивном окне) клавишу. Имя процесса не меняется, изменяется лишь "Handle" заметил через AutoIt Window Info
Буду рад любой помощи

Creat0R 04-01-2011 18:58 1580663

Примерно так:
Код:

ControlSend("Title", "", "", "{ShiftDown}")

ZARG-X 04-01-2011 23:25 1580876

А что если нужных процесса 2? Как не ошибиться в выборе?

Creat0R 04-01-2011 23:39 1580891

Цитата:

Цитата ZARG-X
А что если нужных процесса 2? »

Тогда нужна функция получения Handle окна по процессу:

Код:

$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


ZARG-X 05-01-2011 02:25 1580971

Ковыряя код всё выглядит красиво, но вот не работает ничего. (даже кнопки рабочими сделать не могу)
Creat0R, поможешь еще раз? :pray:

Собственно вот что нужно..

Думаю с окнами понятно, разве что хотелось бы указывание какое окно выбрано (Handle). А вот под "Старт" и "Стоп" залипание клавиши.

Реально такое оживить?

Creat0R 05-01-2011 02:35 1580978

Цитата:

Цитата ZARG-X
Думаю с окнами понятно »

Нет. Я вообще не понял что нужо делать.

Цитата:

Цитата ZARG-X
хотелось бы указывание какое окно выбрано (Handle) »

Handle имеет свойство меняться (после перезапуска приложения), это уникальный идентификатор, на него полагаться нельзя (в смысле на тот что заранее “подсмотрен” в AutoIt Window Info).

ZARG-X 05-01-2011 03:17 1580987

Цитата:

Цитата Creat0R
Handle имеет свойство меняться (после перезапуска приложения) »

Но ведь и программу можно перезапустить. В дальнешем придется снова выбирать окно (тоже после перезапуска).
Хотя это уже не важно, можно обойтись.

Цитата:

Цитата Creat0R
Я вообще не понял что нужо делать. »

Прошу прощения. Мой мозг уже спит без меня.

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

выбираем нужное нам окно в котором будет залипание клавиши.
Это самое сложное пожалуй.

С моими кривыми руками тут самому ничего не сделать...

Creat0R 05-01-2011 10:54 1581084

Цитата:

Цитата ZARG-X
Но ведь и программу можно перезапустить »

Я не понял, а как на счёт...
Цитата:

Цитата ZARG-X
Имя процесса не меняется »

?

Цитата:

Цитата ZARG-X
Нажимаешь кнопку "старт" залипание включено (допустим клавиша f1), нажимаем "стоп" залипание клавиши выключено »

Залипание в целом, или для выбранного окна?

ZARG-X 05-01-2011 13:26 1581187

Легче будет при каждом запуске скрипта указывать окно вручную, разумеется при помощи скрипта.

Цитата:

Цитата Creat0R
Залипание в целом, или для выбранного окна? »

Для выбранного окна

ZARG-X 05-01-2011 23:48 1581665

Неужели это не осуществить? Очень жаль...

Creat0R 06-01-2011 00:10 1581687

Цитата:

Цитата ZARG-X
Неужели это не осуществить? »

Осуществить, просто у меня пока нет времени на это, сорри :(.

ZARG-X 06-01-2011 00:18 1581691

Цитата:

Цитата Creat0R
у меня пока нет времени на это »

Ну чтож, буду ежедневно проверять тему :) надеюсь в недалеком будущем я найду тут нужный ответ.

ZARG-X 06-01-2011 23:40 1582608

Как кнопке
Код:

GUICtrlCreateButton ("text",  110, 140, 80)
дать команду допустим выключить утилиту?

kaster 07-01-2011 00:14 1582622

ZARG-X, читать справку на тему GUI Concepts

ZARG-X 07-01-2011 04:40 1582701

kaster, Спасибо, разобрался.

Собственно появился следующий вопрос.
Код:

Opt("TrayMenuMode",1)

GUISetState()

$exit = TrayCreateItem("Выход")

While 1
    Switch TrayGetMsg()
        Case $exit
            Exit
    EndSwitch
WEnd

Выход из "программы" через трей работает, а как вернуть выход через крестик? Окно игнорирует клик.

kaster 07-01-2011 05:28 1582710

ZARG-X, почитай весь раздел про создание GUI. там есть все, в том числе и выход из программ.
Если вкратце, то нужно мониторить простые системные сообщения посылаемые программе. Ты привел пример когда эти сообщения связанные с нажатием на кнопки в трее - TrayGetMsg(). Для элементов управления самого окна надо мониторить GUIGetMsg

ZARG-X 07-01-2011 06:04 1582713

kaster, :cry: можно кодом? уже столько вариантов пробовал... самое лучшее было когда тело программы не открывалось вообще, а в остальных случаях просто ругалось ошибкой

kaster 07-01-2011 06:21 1582714

ZARG-X, мде...
Код:

$hGUI = GUICreate('GUI Для ленивых', 300, 200)
GUISetState()

Do
Until GUIGetMsg() = -3


ZARG-X 07-01-2011 06:27 1582716

Такое я уже делал, но мне нужно выход через крестик и в трее, вместе они не хотят работать.

Допустим этот код
Код:

$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


kaster 07-01-2011 06:34 1582717

ZARG-X, допустим? :o шутку оценил :lol:
помимо того, чтобы просто клеить разные скрипты, нужно их чуточку понимать. если на пальцах, то ты входишь в бесконечный цикл в котором непрерывно мониторишь состояние окна. а тот кусок который мониторит состояние трея никогда не достигается. какой напрашивается вывод - засунуть оба мониторинга в один бесконечный цикл
Код:

Opt("TrayMenuMode",1)
$hGUI = GUICreate('GUI Для ленивых', 300, 200)
GUISetState()
$exit = TrayCreateItem("Выход")
Do
Until GUIGetMsg() = -3 or TrayGetMsg() = $exit


ZARG-X 07-01-2011 06:37 1582718

kaster, Благодарю :)

Просто я еще даже не новичек в этом деле

ZARG-X 08-01-2011 18:50 1583908

Всем спасибо, я осуществил задуманное :)
Закрываю.

FIRE4ell 31-01-2011 09:37 1600928

здравствуйте,я тока начинаю изучать скрипты,и у меня такая проблема,было как то скучно и я решил попробывать использовать скрипт для какой нибудь игры,далее решил использовать в не активном окне..и тут загвостка!посмотри мой скрип и что тут надо добавить или изменить?

WinWait, Perfect World,
IfWinNotActive, Perfect World, , WinActivate, Perfect World,
WinWaitActive, Perfect World,
Send, {TAB}{F2}
Sleep,5000
Send, {F3}
Sleep,5000
Send, {F4}


Время: 02:37.

Время: 02:37.
© OSzone.net 2001-