Что нового

ControlSend меняет знак точки на "ю"

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Необходимо написать
ControlSend("", "", "", $Topic)

в случае, если $Topic равен, например, "10000.10", то в контроле появляется надпись "10000ю10".
Каким образом сделать так, чтобы знак точки нормально вставлялся в контрол?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir,
А Вы попробуйте $Topic = 10000.10 в английской раскладке написать.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles

эти цифры "1000.10" у меня в переменной. Допустим, у пользователя включена русская раскладка и ее нельзя менять. Можно ли послать переменную, содержащую "1000.10" так, чтобы знак точки не менялся на "ю"?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
А так:
Код:
$Topic = '1100ю10'
MsgBox(0, '', $Topic)
If StringInStr($Topic, 'ю') Then $Topic = StringReplace($Topic, 'ю', '.')
MsgBox(0, '', $Topic)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
StringReplace($Topic, 'ю', '.')


Упс. Опоздал.

:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
Можно, наверное, еще так сделать:
Код:
$Topic = InputBox('', '', '')
MsgBox(0, '', $Topic)
$Topic = StringStripWS($Topic, 8)
If StringInStr($Topic, 'ю') Then $Topic = StringReplace($Topic, 'ю', '.')
If StringInStr($Topic, ',') Then $Topic = StringReplace($Topic, ',', '.')
MsgBox(0, '', $Topic)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles
madmasles сказал(а):
If StringInStr($Topic, 'ю') Then $Topic = StringReplace($Topic, 'ю', '.')


Дело в том, что в переменной "ю" не содержится. Там содержится точка. Однако когда мы вводим эту переменную в форму через ControlSend("", "", "", $Topic), то точка превращается в "ю" :mad:

Причем, если стоит английская раскладка, то точка остается точкой. А если стоит русская раскладка, то ControlSend меняет "." на "ю".
Программно менять раскладку нельзя, так как пользователи не поймут.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
А если так?!
Код:
ControlSend("", "", "", Number($Topic))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: ControlSend меняет знак точки на \"ю\"

Вот ещё вариант:
Код:
$Topic = "10000.10"
MsgBox(0,"", StringLeft(StringFormat("%f",$Topic),StringLen($Topic)))



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

Виноват, разобрался!!! ;D
Вот так:
Код:
StringFormat("%.2f",$Topic)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <WinAPIEx.au3>

$hWnd = ControlGetHandle('', '', '')
If BitAND(_WinAPI_GetKeyboardLayout($hWnd), 0xFFFF) = 0x0419 Then
	$Topic = StringReplace($Topic, '.', '/')
EndIf
ControlSend($hWnd, '', '', $Topic)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
У меня так работает:
Код:
#include <WinAPIEx.au3>
#include <GUIConstantsEx.au3>

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 350, 256, -1, -1)
$Input1 = GUICtrlCreateInput("", 32, 8, 257, 21)
$Button1 = GUICtrlCreateButton("Click", 120, 56, 113, 65)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$sLang = Hex(_WinAPI_GetKeyboardLayout($Form1), 4)
			Run('notepad.exe')
			WinWait('[CLASS:Notepad]')
			If Not WinActive('[CLASS:Notepad]') Then WinActivate('[CLASS:Notepad]')
			WinWaitActive('[CLASS:Notepad]')
			$hHandle = WinGetHandle('[CLASS:Notepad]')
			_WinAPI_SetKeyboardLayout($hHandle, '0x' & $sLang)
			ControlSend('[CLASS:Notepad]', '', '[CLASS:Edit; INSTANCE:1]', GUICtrlRead($Input1))
	EndSwitch
WEnd
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: ControlSend меняет знак точки на \"ю\"

Garrett [?]
Виноват, разобрался!!!
grin.gif
Вот так:Код: AutoIt [Выделить]StringFormat("%.2f",$Topic)

Таким образом вместо 1000.0 вставляет 1000ю00




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

Заработал код, предложенный Yashied'ом (с использованием библиотеки #Include <WinAPIEx.au3> !
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: ControlSend меняет знак точки на \\\"ю\\\"

Боже мой!

С функциями Send и ControlSend нужно что-то делать. Даже вариант Yashied не прокатил. Если по умолчанию включена русская раскладка, то в его варианте вставляется не "1000.10" и не "1000ю10", а "1000/10"! :mad:

Сейчас тестирую такой вариант:

Код:
If BitAND(Get[b]Current[/b]Layout($hWnd), 0xFFFF) = 0x0419 And Get[b]Default[/b]Layout() = 0 Then
	$Topic = StringReplace($Topic, '.', '/')

Т.е. если сейчас раскладка русская, а по умолчанию НЕ русская, то заменить точку на /



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

Кажется, я понял!

При ControlSend значения "1000.10" точка меняется на другой знак, если раскладка по умолчанию не соответствует раскладке в данный момент!

Вот только каким образом это можно быстро проверить?


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

Нашел статью с аналогичной проблемой для AutoHotkey (языки-то родственные).

http://www.script-coding.info/AutoHotkey/AhkRussian_3b.html


Проблема пока не решена...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir
Вы не могли бы привести законченный (тестовый) код для проверки?
Потому как у меня при любой раскладке всё работает.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Re: ControlSend меняет знак точки на \"ю\"

Garrett

Вот, пожалуйста:

Код:
Opt("WinTextMatchMode", 2)

$var = "1000.10"
WinActivate("AkelPad")
ControlSend("AkelPad", "", "", $var)







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

Кажется, получилось! Нужно делать так:

Код:
Opt("WinTextMatchMode", 2)

$var = "1000.10"

WinActivate("AkelPad")

Global $hWnd = WinGetHandle('') 

$def_lang = GetCurrentLayout($hWnd) ; запоминаем текущую раскладку 
if GetDefaultLayout() = 1 Then
	SetCurrentLayout('0419', $hWnd) ; если раскладка по умолчанию русская, то ставим текущую русскую
Else
	SetCurrentLayout('0409', $hWnd) ; иначе - ставим английскую
EndIf

ControlSend("", "", "", $var) ; вставляем текст в "правильной" раскладке

SetCurrentLayout($def_lang, $hWnd) ; возвращаем раскладку до махинаций

Func GetCurrentLayout($hWnd)
	Local $Ret = DllCall('user32.dll', 'long', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0)
	$Ret = DllCall('user32.dll', 'long', 'GetKeyboardLayout', 'long', $Ret[0])
	Return Hex($Ret[0], 4)
EndFunc  

Func GetDefaultLayout()
	If @KBLayout = 00000419 Or @KBLayout = 0419 Then Return 1
	If @KBLayout = 00000409 Or @KBLayout = 0409 Or @KBLayout = 0809  Or @KBLayout = 00000809 Then Return 0
EndFunc
	
Func SetCurrentLayout($sLayout, $hWnd)
	Local $Ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', StringFormat('%08s', StringStripWS($sLayout, 8)), 'int', 0)
	DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0050, 'int', 1, 'int', $Ret[0])
EndFunc



Главная идея, которую нигде еще не говорили: чтобы переменная не изменялась, нужно чтобы текущая раскладка совпадала с раскладкой по умолчанию!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
В моем коде из 11 поста строка
Код:
$sLang = Hex(_WinAPI_GetKeyboardLayout($Form1), 4)
определяет текущую раскладку окна ввода переменной, а строка
Код:
_WinAPI_SetKeyboardLayout($hHandle, '0x' & $sLang)
устанавливает такую же раскладку окна, куда будем отправлять ControlSend().
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles
Да, точно. Но у меня что-то сходу подвисла твоя программа, поэтому не стал в ней сильно разбираться. Каюсь :-\:smile:
 

vmoskalenko

Новичок
Сообщения
1
Репутация
0
Столкнулся с этой же проблемой, но решил по-другому, без переключения клавиатуры.

Код:
$var = "Иванов И.И."
Send(StringReplace($var,".","{ASC 0x002E}"))
 
Верх