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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] ControlSend работает не на всех компьютерах. (http://forum.oszone.net/showthread.php?t=158872)

mymindspam 02-12-2009 01:34 1284706

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

Func presskey($param1)
        _SendMessage($handle, 0x6, 0x1)
        ControlSend($handle, "", "", $param1)
        _SendMessage($handle, 0x6, 0x1)
EndFunc

presskey("c")

На моем компьютере работает нормально а ноутбуке (Samsung r20) не нажимает клавиши букв(тоесть presskey("1") -работает а presskey("c")-нет) . ОС на обоих компах Win XP. Причем на ноуте не получестя даже Send("c"), вручную кнопка конечно же работае.
1)Подозреваю, что нужно отправлять клавиши в виде ascii, подскажите как?
2)Использование ControlSend приводит к периодическому залипанию клавиши shif. Это баг или есть способ лучше?

kaster 02-12-2009 01:54 1284712

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

mymindspam 02-12-2009 02:56 1284732

2kaster
спасибо огромное. Выставил раскладку по умолчанию английской(Панель управления>>Язык и региональные стандарты>>Подробнее>>Язык ввода по умолчанию) и все заработало.

Дайте пожалуйста ответ и на второй вопрос. На офф форуме читал, что существует проблема залипания shift, поделитесь опытом.

Creat0R 02-12-2009 09:50 1284852

Цитата:

Цитата mymindspam
Подозреваю, что нужно отправлять клавиши в виде ascii, подскажите как? »

Чтобы не преключать раскладку, предлагаю такую функцию:
Код:

_ControlSendEx($handle, "", "", $param1)

Func _ControlSendEx($sTitle, $sText, $iCtrlID, $sKeys, $iFlag=0)
    If @KBLayout = 0419 Then
        Local $sANSI_Chars = "ёйцукенгшщзхъфывапролджэячсмитьбю.?"
        Local $sASCII_Chars = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./&"

        Local $aSplit_Keys = StringSplit($sKeys, "")
        Local $sKey
        $sKeys
= ""

        For $i = 1 To $aSplit_Keys[0]
            $sKey = StringMid($sANSI_Chars, StringInStr($sASCII_Chars, $aSplit_Keys[$i]), 1)

            If $sKey <> "" Then
                $sKeys &= $sKey
            Else
                $sKeys &= $aSplit_Keys[$i]
            EndIf
        Next
    EndIf

    Return ControlSend($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
EndFunc

Цитата:

Цитата mymindspam
Использование ControlSend приводит к периодическому залипанию клавиши shif. Это баг или есть способ лучше? »

Обходится примерно так:
Код:

#include <Misc.au3>

Func _ControlSendExEx($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
    Local $hUser32DllOpen = DllOpen("User32.dll")

    While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
        Sleep(10)
    WEnd

    DllClose($hUser32DllOpen)
    Return _ControlSendEx($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
EndFunc


mymindspam 02-12-2009 16:04 1285115

2Creat0R
Это просто магия, спасибо *пошел читать гайд по DllOpen*

Creat0R 03-12-2009 00:31 1285521

Цитата:

Цитата mymindspam
пошел читать гайд по DllOpen »

На самом деле "магия" не в ней, хотя для залипания она используется, но лучше почитать справку по _IsPressed.


Время: 21:55.

Время: 21:55.
© OSzone.net 2001-