Что нового

Не срабатывают некоторые send'ы. В чем здесь может быть дело?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Вот код программы:

Код:
#Include <Misc.au3>

AutoItSetOption("TrayAutoPause", 0)

if _Singleton("test",1) = 0 Then 
	TrayTip ("AutoIt", "Программа уже запущена!", 1)
	sleep(2000)
	TrayTip("clears any tray tip","",0)
	Exit
EndIf

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
TraySetToolTip ("версия 1.0 beta")


TrayCreateItem("Информация о программе")
TrayItemSetOnEvent(-1, "_Author")
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Exit")

TrayTip ("", "Программа запущена", 1)
sleep(2000)
TrayTip("clears any tray tip","",0)

Func _Author()
		MsgBox(64, "Информация о программе", "")
EndFunc

Func _Exit()
		Exit
EndFunc

Opt("SendKeyDownDelay", 100)
while True
	if WinExists("Error", "OK") Then
		WinClose ("Error", "OK")
		WinActivate ("")
		$Matches = StringRegExp(WinGetText(""), "Адрес\(а\) ссылки: (\d+\.?\d*)", 1)
		If @error = 0 Then
			$link = $Matches[0]
		EndIf

		WinActivate("")

# вот эта кнопка не срабатывает на некоторых машинах
		Send ("!n")
		ControlSetText("", "", "", $link)
		Send ("{ENTER}")		
	EndIf
	
	Sleep (50)
Wend



Кто сталкивался с подобным, в чем здесь может быть дело?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

Suppir
Насколько я успел понять, важна не раскладка, а раскладка по умолчанию...
Если используешь английские буквы, то надо включить по умолчанию английскую раскладку...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

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



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

А как можно узнать, какая раскладка включена по умолчанию?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

Suppir
Как предлагал Guezt:
дублировать функцию HotKeySet()
Код:
HotKeySet("+!d","DATETIME")
HotKeySet("+!в","DATETIME")

или пользоваться функцией Yashied:
_HotKeyAssign()

Раскладка по умолчанию:
Код:
if @KBLayout<>409 then
  SplashTextOn("Старт","Горячие клавиши не будут функционировать...",400,40,-1,int(@DesktopHeight*3/4),0,"courier",8)
  Sleep(3000)
  SplashOff()
 endif
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

Да, только у меня не хоткей, а Send.
Если я нажму один раз ALT-N, то откроется форма
Если я нажму второй раз ALT-т, то в форму вставится ненужный символ.
Поэтому дублирование здесь не очень подходит...
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

Suppir
Извини, я ориентировался по названию темы... :smile:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Не срабатывают некоторые хоткеи. В чем здесь может быть дело?

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

Guezt

Продвинутый
Сообщения
335
Репутация
81
Если я нажму один раз ALT-N, то откроется форма
Если я нажму второй раз ALT-т, то в форму вставится ненужный символ.
вот сам же пишешь :smile: добавь проверку открытия формы и все.
Код:
WinActivate("ГАРАНТ")
        Send ("!n")
if winactivate("форма") then ; тут проверку открытия формы добавь я просто незнаю как она выглядит думаю что окно, если нет то по другому делай проверку...
        ControlSetText("", "", "", $link)
        Send ("{ENTER}")        
else Send("!т") ; если не сработала английская раскладка засылаем русскую...
ControlSetText("", "", "", $link)
        Send ("{ENTER}")  
endif


и тут ещеhttp://autoit-script.ru/index.php/topic,835.0.html по-моему ты задавал вопрос если решен нажми соответствующую кнопку :smile:
 

TheBloodTear

Знающий
Сообщения
36
Репутация
9
Попробуй так ;).. Отпишись, помогло или нет? :smile:

Код:
#Include <Misc.au3>

AutoItSetOption("TrayAutoPause", 0)

if _Singleton("test",1) = 0 Then 
    TrayTip ("AutoIt", "Арчилинк уже запущен!", 1)
    sleep(2000)
    TrayTip("clears any tray tip","",0)
    Exit
EndIf
Opt("WinTitleMatchMode", 4)
Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
TraySetToolTip ("Арчилинк, версия 1.0 beta")


TrayCreateItem("Информация о программе")
TrayItemSetOnEvent(-1, "_Author")
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Exit")

TrayTip ("Арчилинк", "Арчилинк запущен", 1)
sleep(2000)
TrayTip("clears any tray tip","",0)

Func _Author()
        MsgBox(64, "Информация о программе", "Арчилинк, версия 1.0 beta      " & @CRLF & @CRLF & "Автор - Suppir," & @CRLF & "[email protected]")
EndFunc

Func _Exit()
        Exit
EndFunc

Opt("SendKeyDownDelay", 100)
while True
    if WinExists("Error", "OK") Then
        WinClose ("Error", "OK")
        WinActivate ("АРХИВАРИУС")
        $Matches = StringRegExp(WinGetText(""), "Адрес\(а\) ссылки: (\d+\.?\d*)", 1)
        If @error = 0 Then
            $link = $Matches[0]
        EndIf

        WinActivate("ГАРАНТ")
	$hWnd = WinGetHandle("ГАРАНТ")
	If _GetKeyboardLayout($hWnd)) = "00000419" Then 
		_SetKeyboardLayout("00000409", $hWnd)
		Send ("!n")
		_SetKeyboardLayout("00000419", $hWnd)
	Else
		Send ("!n")
	EndIf
        ControlSetText("", "", "", $link)
        Send ("{ENTER}")        
    EndIf
    
    Sleep (50)
Wend

Func _GetKeyboardLayout($hWnd)
    Local $ret = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0)
          $ret = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $ret[0])
          Return "0000" & Hex($ret[0], 4)
EndFunc

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, _
                                                "int", $WM_INPUTLANGCHANGEREQUEST, _
                                                "int", 1, _
                                                "int", $ret[0])
EndFunc
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
to TheBloodTear

простое переключение раскладки не поможет!,я сам не раз сталкивался с этим, это не просто слать текст в окно программы, тут по сути Send - вызов хоткея в окне программы, Suppir же говорит либо не срабатывает, либо там где срабатывает шлет в текст сочетание ALT+т в окно формы...

так что просто надо проверить сработало или нет, и если сработало то продолжать код, а если нет то заслать ALT+т ( то есть в русской раскладке ) ему просто надо добавить проверку на сработку посыла ALT+N (тоесть открылась форма или нет) я просто сам не раз с таким сталкивался и ничего тут не поделать действительно, только вот так вот "выкручиваться"
:smile:
 

TheBloodTear

Знающий
Сообщения
36
Репутация
9
Guezt сказал(а):
to TheBloodTear

простое переключение раскладки не поможет!,я сам не раз сталкивался с этим, это не просто слать текст в окно программы, тут по сути Send - вызов хоткея в окне программы, Suppir же говорит либо не срабатывает, либо там где срабатывает шлет в текст сочетание ALT+т в окно формы...

так что просто надо проверить сработало или нет, и если сработало то продолжать код, а если нет то заслать ALT+т ( то есть в русской раскладке ) ему просто надо добавить проверку на сработку посыла ALT+N (тоесть открылась форма или нет) я просто сам не раз с таким сталкивался и ничего тут не поделать действительно, только вот так вот "выкручиваться"
:smile:
Не совсем так :smile:.. У автора в программе, как я понял, при русской раскладке ставится "т" в активную форму, а при английской открывается новое окно(или что-то подобное) и нет возможности проверить сработало или нет :whistle:..

Мой совет, вообще избегать Send'а, и использовать в подобных случаях "ControlClick" или "ControlSend" ;).. Не будет надобности использовать активацию окон и проч :smile:..

Если получить информацию от окон не получается, то тогда все же играться с изменениями языка:smile:..
Просто, как я понимаю изменить язык в приложении и язык в системе - это разные вещи:smile:.. Поэтому в условии:

Код:
If _GetKeyboardLayout($hWnd)) = "00000419" Then 
_SetKeyboardLayout("00000409", $hWnd)
Send ("!n")
_SetKeyboardLayout("00000419", $hWnd)


попробуй заменить Send ("!n") на Send ("!т") :

Код:
If _GetKeyboardLayout($hWnd)) = "00000419" Then 
_SetKeyboardLayout("00000409", $hWnd)
Send ("!т")
_SetKeyboardLayout("00000419", $hWnd)


Я уверен один из способов поможет;)..
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
А еще лучше
Код:
ControlSetText()
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: Не срабатывают некоторые send\'ы. В чем здесь может быть дело?

Всем спасибо! Помог рецепт от Guezt с проверкой существования формы.


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

TheBloodTear, переключать раскладку нежелательно, потому что пользователи будут недовольны такими "махинациями" скрипта
 
Верх