Что нового

Можно ли использовать функции других приложений через AutoIt?

incrome

by Incrome
Сообщения
24
Репутация
0
Есть вопрос:
Можно ли через AutoIt написать код который вкручивался бы в другую программу и использовал её функции.
Ну например:
Есть Экранная Клавиатура, могу ли я использовать её функции через AutoIt.
Или вообще знает кто как работает Экранная Клавиатура. И реально ли написать её аналог на AutoIt?
 

agikon

Знающий
Сообщения
789
Репутация
17
autoit может посылать в любое окно любые буквы, цифры, символы, нажатие других клавишь, вобщем всё что угодно может послать в нужное окно.
смотря что вам надо, просто не совсем понятно ваша задача.
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
autoit может посылать в любое окно любые буквы, цифры, символы, нажатие других клавишь, вобщем всё что угодно может послать в нужное окно.
смотря что вам надо, просто не совсем понятно ваша задача.

Я же и пишу, мне нужно реализовать функции экранной клавиатуры, либо используя уже готовую программу(не AutoIt скрипт), либо написать её на AutoIt.
А именно вопрос заключался в том что:
Допустим я могу отправлять запросы, даже в отдельные окна через ControlSend, но если я буду отправлять допустим, {F1} в окно Экранной Клавиатуры, это не даст никакого результата, напротив если я кликну мышкой на экранной клавиатуре у меня всё выйдет. Суть в том что мне нужно как бы эмулировать нажатие клавиши допустим, {F1} с помощью AutoIt как мышкой, но со скрипта!
 

Arei

Скриптер
Сообщения
938
Репутация
115
как я понял,нужна Виртуальная клавиатура.На форуме есть решения.Используйте форум.
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
как я понял,нужна Виртуальная клавиатура.На форуме есть решения.Используйте форум.

Искал, есть 1 ответ: "Используй ControlSend"

Проблема в том что не хочет работать через ControlSend.

Если бы можно было бы как бы дёргать за верёвочки именно в самой Виртуальной Клавиатуре... Но это уже походу знания из Assembler нужны.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А если через ControlСlick() кликать на кнопки виртуальной клавиатуры ?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Можно через AutoIt Window Info или через Control Viewer.
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Не определяет контролы... ни одна прога)
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0

Не аналог стандартной Клавиатуры... Не те функции использует...
Скажем у меня есть игра в которой стоит блок на функции такие как используются тут:
Поэтому я и сказал аналог.. а значит и функции которая использует соответственно...


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

- Эта клава использует аутоитовский ControlSend а он не катит... я подозреваю что стандартная Виртуальная клава использует хуки...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот аналог ControlSend()
Код:
#include <SendMessage.au3>

Func TextSend($hWnd, $Text)
	if Not IsHWnd($hWnd) Then _
	$hWnd = GUICtrlGetHandle($hWnd)
	For $i = 1 To StringLen($Text)
		$Char = StringMid($Text,$i,1)
		_SendMessage($hWnd,$WM_CHAR,AscW($Char),0)
	Next
EndFunc


или

Код:
#include <SendMessage.au3>

Func KeySend($hWnd, $Virtual_Key_Code)
	if Not IsHWnd($hWnd) Then _
	$hWnd = GUICtrlGetHandle($hWnd)
	_SendMessage($hWnd,$WM_KEYDOWN,$Virtual_Key_Code,0)
	_SendMessage($hWnd,$WM_KEYUP,$Virtual_Key_Code,0)
EndFunc


$hWnd - Контрол
$Virtual_Key_Code - Hex код клавиши (на пример 0x10). Список клавиш
$Text - Текст
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Вот аналог ControlSend()
Код: AutoIt [Выделить]
#include <SendMessage.au3>

Func TextSend($hWnd, $Text)
if Not IsHWnd($hWnd) Then _
$hWnd = GUICtrlGetHandle($hWnd)
For $i = 1 To StringLen($Text)
$Char = StringMid($Text,$i,1)
_SendMessage($hWnd,$WM_CHAR,AscW($Char),0)
Next
EndFunc

или

Код: AutoIt [Выделить]
#include <SendMessage.au3>

Func KeySend($hWnd, $Virtual_Key_Code)
if Not IsHWnd($hWnd) Then _
$hWnd = GUICtrlGetHandle($hWnd)
_SendMessage($hWnd,$WM_KEYDOWN,$Virtual_Key_Code,0)
_SendMessage($hWnd,$WM_KEYUP,$Virtual_Key_Code,0)
EndFunc

$hWnd - Контрол
$Virtual_Key_Code - Hex код клавиши (на пример 0x10). Список клавиш
$Text - Текст

Спасибо!
Хорошо, на вид что то мощное щас попробую интегрировать.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот еще (взято с офф. сайта):
Код:
Global Const $VK_OEM_PLUS = 0xBB
Global Const $VK_OEM_MINUS = 0xBD
Global Const $VK_OEM_3 = 0xC0
Global Const $VK_TAB = 0x9
Global Const $VK_ESC = 0x1B
Global Const $VK_F5 = 0x74
Global Const $VK_F12 = 0x7B

Func _SendKeys($hWnd, $keys)
    If $hWnd <= 0 Or StringLen($keys) = 0 Then
        SetError(-1)
        Return False
    EndIf
    $keys = StringUpper($keys)
    $keys = StringReplace($keys, "`", Chr($VK_OEM_3))
    $keys = StringReplace($keys, "~", Chr($VK_OEM_3))
    $keys = StringReplace($keys, "-", Chr($VK_OEM_MINUS))
    $keys = StringReplace($keys, "=", Chr($VK_OEM_PLUS))
    $keys = StringReplace($keys, "{ENTER}", Chr(0xD))
    $keys = StringReplace($keys, "{TAB}", Chr(0x9))
    $keys = StringReplace($keys, "{ESC}", Chr($VK_ESC))
    $keys = StringReplace($keys, "{F5}", Chr($VK_F5))
    $keys = StringReplace($keys, "{F12}", Chr($VK_F12))
    $keys = StringReplace($keys, "{SHIFT}", "+")
    Local $i, $ret
    Local $shiftdown = False
    For $i = 1 To StringLen($keys)
        If StringMid($keys, $i, 1) = "+" Then
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x002A0001)
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x402A0001)
            $shiftdown = True
            Sleep(1)
            ContinueLoop
        Else
            
            $ret = DllCall("user32.dll", "int", "MapVirtualKey", "int", Asc(StringMid($keys, $i, 1)), "int", 0)
            If IsArray($ret) Then
                DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0]))
                Sleep(1)
                DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0]) + 0xC0000000)
            EndIf
        EndIf
        If $shiftdown Then
            Sleep(1)
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", 0x10, "long", 0xC02A0001)
            $shiftdown = False
        EndIf
    Next
    Return True
EndFunc 

Func _ArrowKey($hWnd, $key)
    If $hWnd <= 0 Or ($key <> "left" And $key <> "right" And $key <> "up" And $key <> "down") Then
        SetError(-1)
        Return
    EndIf
    Local $wParam, $lParam, $ret
    If $key = "left" Then
        $wParam = 0x25
        $lParam = 0x14B0001
    ElseIf $key = "right" Then
        $wParam = 0x27
        $lParam = 0x14D0001
    ElseIf $key = "down" Then
        $wParam = 0x28
        $lParam = 0x1500001
    ElseIf $key = "up" Then
        $wParam = 0x26
        $lParam = 0x1480001
    EndIf
    $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", $wParam, "int", $lParam)
    If $ret[0] = 0 Then
        MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYDOWN message")
        SetError(-2)
        Return
    EndIf
    Sleep(2)
    $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", $wParam, "int", ($lParam + 0xC0000000))
    If $ret[0] = 0 Then
        MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYUP message")
        SetError(-3)
        Return
    EndIf
EndFunc


Пример:
Код:
$hwnd = WinGetHandle("Game Title")
_SendKeys($hwnd, "{ENTER}keys{ENTER}")
_ArrowKey($hwnd, "up")
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Код:
#include <WinAPI.au3>
#include <WinAPIEx.au3>
#Include <Array.au3>
#include <process.au3>
#include <SendMessage.au3>


HotKeySet("{ESC}", "OnAutoItExit")
HotKeySet("{Home}", "Farm")

Func OnAutoItExit() 
Exit
EndFunc

while 1
	sleep (100)
WEnd


Func Farm()
	;WinWaitActive("Экранная Клавиатура")
	
	$list = ProcessList("hvk.exe")
for $i = 1 to $list[0][0]
 $Data= _WinAPI_EnumProcessWindows($list[$i][1], 0) 
;_ArrayDisplay($Data) 
next
	$hWnd = WinGetHandle( "[CLASS:$Data[1][1]]" )
	$Virtual_Key_Code = 0x10
	KeySend($hWnd, $Virtual_Key_Code)
EndFunc


Func KeySend($hWnd, $Virtual_Key_Code)
    if Not IsHWnd($hWnd) Then _
    $hWnd = GUICtrlGetHandle($hWnd)
    _SendMessage($hWnd,$WM_KEYDOWN,$Virtual_Key_Code,0)
    _SendMessage($hWnd,$WM_KEYUP,$Virtual_Key_Code,0)
EndFunc


Допустим вот... Ошибка:

_SendMessage($hWnd,$WM_KEYDOWN,$Virtual_Key_Code,0)
_SendMessage($hWnd,^ ERROR
>Exit code: 1 Time: 3.741
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Добавь это:
Код:
#include <WindowsConstants.au3>
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Добавь это:
Код: AutoIt [Выделить]
#include <WindowsConstants.au3>

Угу, действительно...

А ты их у себя проверял? Честно говоря они у меня не пашут в блокноте даже...


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

Вот полный код не пойму что не так :( :


Код:
#include <WinAPI.au3>
#include <WinAPIEx.au3>
#Include <Array.au3>
#include <process.au3>
#include <SendMessage.au3>
#include <WindowsConstants.au3>

Global Const $VK_OEM_PLUS = 0xBB
Global Const $VK_OEM_MINUS = 0xBD
Global Const $VK_OEM_3 = 0xC0
Global Const $VK_TAB = 0x9
Global Const $VK_ESC = 0x1B
Global Const $VK_F5 = 0x74
Global Const $VK_F12 = 0x7B



HotKeySet("{ESC}", "OnAutoItExit")
HotKeySet("{Home}", "Farm")

Func OnAutoItExit() 
Exit
EndFunc

while 1
	sleep (100)
WEnd


Func Farm()
	$list = ProcessList("notepad.exe")
for $i = 1 to $list[0][0]
 $Data= _WinAPI_EnumProcessWindows($list[$i][1], 0) 
;_ArrayDisplay($Data) 
next
	$hWnd = WinGetHandle( "[CLASS:$Data[1][1]]" )
	$Virtual_Key_Code = 0x10
	_SendKeys($hwnd, "M keys M")
	KeySend($hwnd, 0x4D)
	MsgBox(1,"","")
EndFunc


Func KeySend($hWnd, $Virtual_Key_Code)
    if Not IsHWnd($hWnd) Then _
    $hWnd = GUICtrlGetHandle($hWnd)
    _SendMessage($hWnd,$WM_KEYDOWN,$Virtual_Key_Code,0)
    _SendMessage($hWnd,$WM_KEYUP,$Virtual_Key_Code,0)
EndFunc


Func _SendKeys($hWnd, $keys)
    If $hWnd <= 0 Or StringLen($keys) = 0 Then
        SetError(-1)
        Return False
    EndIf
    $keys = StringUpper($keys)
    $keys = StringReplace($keys, "`", Chr($VK_OEM_3))
    $keys = StringReplace($keys, "~", Chr($VK_OEM_3))
    $keys = StringReplace($keys, "-", Chr($VK_OEM_MINUS))
    $keys = StringReplace($keys, "=", Chr($VK_OEM_PLUS))
    $keys = StringReplace($keys, "{ENTER}", Chr(0xD))
    $keys = StringReplace($keys, "{TAB}", Chr(0x9))
    $keys = StringReplace($keys, "{ESC}", Chr($VK_ESC))
    $keys = StringReplace($keys, "{F5}", Chr($VK_F5))
    $keys = StringReplace($keys, "{F12}", Chr($VK_F12))
	$keys = StringReplace($keys, "M", Chr(0x4D))
    $keys = StringReplace($keys, "{SHIFT}", "+")
    Local $i, $ret
    Local $shiftdown = False
    For $i = 1 To StringLen($keys)
        If StringMid($keys, $i, 1) = "+" Then
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x002A0001)
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", 0x10, "long", 0x402A0001)
            $shiftdown = True
            Sleep(1)
            ContinueLoop
        Else
            
            $ret = DllCall("user32.dll", "int", "MapVirtualKey", "int", Asc(StringMid($keys, $i, 1)), "int", 0)
            If IsArray($ret) Then
                DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0]))
                Sleep(1)
                DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", Asc(StringMid($keys, $i, 1)), "long", _MakeLong(1, $ret[0]) + 0xC0000000)
            EndIf
        EndIf
        If $shiftdown Then
            Sleep(1)
            DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", 0x10, "long", 0xC02A0001)
            $shiftdown = False
        EndIf
    Next
    Return True
EndFunc 

Func _ArrowKey($hWnd, $key)
    If $hWnd <= 0 Or ($key <> "left" And $key <> "right" And $key <> "up" And $key <> "down") Then
        SetError(-1)
        Return
    EndIf
    Local $wParam, $lParam, $ret
    If $key = "left" Then
        $wParam = 0x25
        $lParam = 0x14B0001
    ElseIf $key = "right" Then
        $wParam = 0x27
        $lParam = 0x14D0001
    ElseIf $key = "down" Then
        $wParam = 0x28
        $lParam = 0x1500001
    ElseIf $key = "up" Then
        $wParam = 0x26
        $lParam = 0x1480001
    EndIf
    $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x100, "int", $wParam, "int", $lParam)
    If $ret[0] = 0 Then
        MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYDOWN message")
        SetError(-2)
        Return
    EndIf
    Sleep(2)
    $ret = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWnd, "int", 0x101, "int", $wParam, "int", ($lParam + 0xC0000000))
    If $ret[0] = 0 Then
        MsgBox(16, "_ArrowKey Error", "There was an error posting the WM_KEYUP message")
        SetError(-3)
        Return
    EndIf
EndFunc
 
Верх