PDA

Показать полную графическую версию : [решено] ControlSend работает не на всех компьютерах.


mymindspam
02-12-2009, 01:34
Пишу приложение - Бота для онлайн игры.
Использую для эмуляции нажатия кнопок при неактивном окне клиента игры, следующую функцию.
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
подозреваю, что раскладка по умолчанию на проблемной машине - русская.
если да, то как вариант выход - менять на английскую

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

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

Creat0R
02-12-2009, 09:50
Подозреваю, что нужно отправлять клавиши в виде ascii, подскажите как? »
Чтобы не преключать раскладку, предлагаю такую функцию:

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

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

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aSplit_Keys = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)($sKeys, "")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sKey
$sKeys = ""

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSplit_Keys[0]
$sKey = StringMid (http://www.autoitscript.com/autoit3/docs/functions/StringMid.htm)($sANSI_Chars, StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($sASCII_Chars, $aSplit_Keys[$i]), 1)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sKey <> "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sKeys &= $sKey
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sKeys &= $aSplit_Keys[$i]
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) ControlSend (http://www.autoitscript.com/autoit3/docs/functions/ControlSend.htm)($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

Использование ControlSend приводит к периодическому залипанию клавиши shif. Это баг или есть способ лучше? »
Обходится примерно так:
#include <Misc.au3>

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ControlSendExEx($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hUser32DllOpen = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)("User32.dll")

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) _IsPressed("10", $hUser32DllOpen) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) _IsPressed("11", $hUser32DllOpen) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) _IsPressed("12", $hUser32DllOpen)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(10)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

DllClose (http://www.autoitscript.com/autoit3/docs/functions/DllClose.htm)($hUser32DllOpen)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) _ControlSendEx($sTitle, $sText, $iCtrlID, $sKeys, $iFlag)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

mymindspam
02-12-2009, 16:04
2Creat0R
Это просто магия, спасибо *пошел читать гайд по DllOpen*

Creat0R
03-12-2009, 00:31
пошел читать гайд по DllOpen »
На самом деле "магия" не в ней, хотя для залипания она используется, но лучше почитать справку по _IsPressed.




© OSzone.net 2001-2012