Что нового

проблемы с шифтом при использовании ControlSend

palub

Новичок
Сообщения
32
Репутация
3
Дорогие друзья, помогите пожалуйста с это функцией.
Проблема такова при частом использовании можно сказать отказывает шифт, и не позволяет писать нормально в другие программы.
Использую это
Код:
Opt("SendCapslockMode", 0)
Opt("SendKeyDownDelay", 2)

ибо если не использую то клавиатура вообще отказывает парой, а иногда пишет "ВоТ таК, Что ПОЛноСтью выбЕшИВаеТ"

Отправляю я {tab}, {F1} - {F12} очень часто, и в игру.
Не знаю уже к чему прибегнуть, для того чтобы избавится от этой проблемы.
Дам вам простенький скрипт, очень похожий на мой, и вы увидите что это такое.
После запуска попробуйте зажать шифт и написать что нибудь в скайп например. допустим напишите "*?*("*?№?:;);№:?:"


Код:
;ВНИМАНИЕ !!! ЕСЛИ НЕ ЗНАЕШЬ КАК ЭКСТРЕННО ОСТАНОВИТЬ СКРИПТ ТО НЕ ПЫТАЙСЯ ЕГО ЗАПУСТИТЬ !
Run('notepad.exe')

Global $WinHandle = WinWait("[CLASS:Notepad]", "", 5)

Func _1()
ControlSend($WinHandle, "", "Edit1", "{F5}")
ControlSend($WinHandle, "", "Edit1", "{tab}")
EndFunc

While 1
	_1()
	Sleep(1)
wend


Вот такие вот проблемы, уже у многих спрашивал как исправить, никто не сталкивался с подобным.
Но советуют как DLLCall, так и перейти с этого языка на другой.
Но DLLCall не удобен так как у меня используются от F1 до F12, а на другой язык переписывать около 3х тысяч строк кода (не включая библиотеки и стандартные функции) слишком долго и, извиняюсь, йобично.

Может быть кто-то знает как решить траблу ?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
palub
Ну так увеличьте паузу, хотя я думаю врядли(или "врятли" как правильней :smile:) поможет т.к. ControlSend() у меня перекрывает при работе еще и CapsLock, заставляя писать мелким шрифтом.
OffTopic:
Может "шифт" для темы сменить на shift а то на лету прочитал как "шрифт"
 
Автор
P

palub

Новичок
Сообщения
32
Репутация
3
В том то и дело что паузу увеличить не могу, иначе скрипт будет категорически медленный.
Подскажите через что отправлять F1-12 ? PostMessage, или MapVirtualKey ?
Да, и, MnM, прочти еще раз и внимательнее, я описал решение проблемы с капс локом. Но с шифтом незадача.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
palub
Вот так получилось для блокнота
Код:
#include<WindowsConstants.au3>
Run("notepad.exe")
Global Const $vk_F5=0x74;Виртуальная клавиша для F5
Global $WinHandle = WinWait("[CLASS:Notepad]", "", 5)
Func _1()
	DllCall("user32.dll","bool","PostMessage","hwnd",ControlGetHandle("[class:Notepad]","",15),"uint",$wm_keydown,"wparam",$vk_F5,"lparam",0)
EndFunc
While 1
    _1()
    Sleep(1)
wend




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

С 1-го раза :D(Можно поздравить=) )
Ах да... PostMessage не выполняется когда клавиатура "занята"(т.е. на ней печатают) т.е. отправляет события в очередь
 
Автор
P

palub

Новичок
Сообщения
32
Репутация
3
MnM, уже нашел и попробовал данную вещь. В свернутое окно не отправляет.
Нужно чтобы отправило в свернутое окно.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
palub
а окно обязательно свертывать его нельзя "ужать" при помощи WinMove()?
 
Автор
P

palub

Новичок
Сообщения
32
Репутация
3
MnM [?]
alubа окно обязательно свертывать его нельзя "ужать" при помощи WinMove()?
Нет не проще, бот распостроняется по людям, а игра (ммо рпг для которого предусмотрен бот) сама по себе предусматривает функцию сворачивания.... так что WinMove мне не подходит
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не знаю почему, но Yashed исключил _WinAPI_GetAsyncKeyState из WinAPIex.au3 :(
Поэтому берём DllCall
Код:
Opt("SendCapslockMode", 0)
Opt("SendKeyDownDelay", 2)

HotKeySet("{ESC}", "Terminate");выход

Func Terminate()
    Exit
EndFunc

Run('notepad.exe')

Global $WinHandle = WinWait("[CLASS:Notepad]", "", 5)

Func _1()
$Ret = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', 0x10) 
If Not BitAND($Ret[0], 0x8001) Then  ; а здесь мог бы быть _WinAPI_GetAsyncKeyState(0x10)
	ControlSend($WinHandle, "", "Edit1", "{SHIFTDOWN}{F5}")
	ControlSend($WinHandle, "", "Edit1", "{SHIFTDOWN}{tab}")
Else
	ControlSend($WinHandle, "", "Edit1", "{F5}")
	ControlSend($WinHandle, "", "Edit1", "{tab}")
EndIf

EndFunc

While 1
	_1()
    Sleep(10)
wend

И, кстати, palub, уже обсуждалось на форуме, минимальное значение для Sleep - 10. Если указывать меньше, то будет всё равно 10.

И, да - блокнот неудачный объект для тестирования. Из-за того как он обрабатывает F5. Но мы же решаем проблему с Shift, а не с F5.
;D
 
Автор
P

palub

Новичок
Сообщения
32
Репутация
3
C2H5OH, за ответ спасибо, о снова не походит. Игра игнорирует "{SHIFTDOWN}{F5}", если бы так было можно то давно принял в вооружение. Так что мой последний вариант (как безысходность) это DllCall.
Мне предложили код Delpfi, он рабочий, кто сможет перевести это на автоит ?
Код:
procedure PostKeyboardEvent(H_: HWND; KeyKode, State: integer);
var
  Temp: TInput;
begin
  Temp.IType := INPUT_KEYBOARD;
  Temp.ki.time := 0;
  Temp.ki.dwExtraInfo := cardinal(nil);
  Temp.ki.wVk := KeyKode and $FF;
  Temp.ki.wScan := MapVirtualKey(KeyKode, 0) and $FF;
  Temp.ki.dwFlags := STATE;
  SendInput(1, Temp, SizeOf(Temp));
  Sleep(50);
  SendMessage(H_, WM_LBUTTONDOWN, 0, 0);
  Sleep(50);
  SendMessage(H_, WM_LBUTTONUP, 0, 0);
end;
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
не походит. Игра игнорирует "{SHIFTDOWN}{F5}"

Ну, вариант
Код:
If Not BitAND($Ret[0], 0x8001) Then  
	ControlSend($WinHandle, "", "Edit1", "{F5}")
	ControlSend($WinHandle, "", "Edit1", "{SHIFTDOWN}")
	ControlSend($WinHandle, "", "Edit1", "{tab}")
	ControlSend($WinHandle, "", "Edit1", "{SHIFTDOWN}")


тоже не вызывает заявленной проблемы с Shift.
;D
 
Верх