Что нового

Как проверить выделен текст или нет

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Хочу сделать программу исправление текста в неправильно набранной раскладке клавиатуры. Столкнулся с проблемой, как проверить выделен ли текст или нет.
Если выделен выполнить замену выделенного, если не выделен, то выделить последнее слово.

Попробовал вариант сравнить старый буфер обмена с новым, если не совпадает, то текст выделен. Но этот вариант не стопроцентный, так как если в буфере будет выделенное слово то сработает автовыделение.

Это ведь как-то работает в Arum Switcher
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Думаю можно использовать функцию PixGetColor.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
каким боком? там пикселы могуть быть какие угодно. И кстати, может PixelGetColor?


у меня пока так:
Код:
$sOld_bufer = ClipGet() ; для восстановления буфера
;проверка выделенного текста, если не выделен, то выделяем
_SendEx("^{INS}")
Sleep(10)
$sSelected_Text = ClipGet()
Sleep(10)
If $sSelected_Text=$sOld_bufer Then
	_SendEx("+{HOME}") ; выделяем текст
	;_SendEx("^+{LEFT}") ; выделяем текст
	_SendEx("^{INS}") ; копируем текст
	$sSelected_Text = ClipGet()
Sleep(10)
EndIf
 

Yashied

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
OffTopic:
Это удар ниже пояса...
:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied [?]
Это удар ниже пояса
Ничего подобного, я просто свою утилиту не публиковал тут, а существует она уже почти 2 года. Кстати код во втором сообщении от AZJIO взят из исходника этой утилиты (с небольшим изменением).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Везде один плагиат... Шутка.

:smile:
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
CreatoR
CreatoR сказал(а):
взят из исходника этой утилиты (с небольшим изменением)
Фактически я стал полностью переписывать, потому что твой подход мне совершенно не понятен, таблица, из которой нужно придумывать как её использовать, мне кажется проще загнать обе раскладки в массив и сверять по индексу.
В общем логику пишу с нуля, кроме известных приёмов - восстановить буфер, защита залипания клавиш.
Ну и если твою утилиту запустить не удалось, решил потренировать мозги. Кстати в Arum Switcher нехватает режима, когда нужно переводить текст не инвертированием, а в конретную раскладку, когда часть слова напечатана в неправильной раскладке.

Код:
TraySetIcon("fontext.dll",3)
Opt("TrayMenuMode", 1)
HotKeySet('{ESC}', "_Quit") ;по желанию выход по ESC
HotKeySet("!{ю}", "_Re") ; переключение раскладки

;_Singleton("Simple_Txt_Switcher") ; не запускать дважды

Opt("SendKeyDelay", 1)
Opt("SendKeyDownDelay", 1)
#include <Misc.au3>
#include <Array.au3>

$aEn = StringSplit("`qwertyuiop[]asdfghjkl;'zxcvbnm,./&", "")
$aRu = StringSplit("ёйцукенгшщзхъфывапролджэячсмитьбю.?", "")


While 1
	Sleep(10)
WEnd

Func _Re()
	$sOld_bufer = ClipGet() ; для восстановления буфера
	;проверка выделенного текста, если не выделен, то выделяем
	_SendEx("^{INS}")
	Sleep(10)
	$sSelected_Text = ClipGet()
	Sleep(10)
	If $sSelected_Text=$sOld_bufer Then
		;_SendEx("+{HOME}") ; выделяем строку
		_SendEx("^+{LEFT}") ; выделяем слово
		_SendEx("^{INS}") ; копируем текст
		$sSelected_Text = ClipGet()
	Sleep(10)
	EndIf
	$New_Text=''
	$aSplitTextArr = StringSplit($sSelected_Text, "")
	
; ищем справа-налево последний валидный символ в тексте, по которому можно определить язык
 $bykva=''
For $i = StringLen($sSelected_Text) to 1 Step -1
	If StringInStr('ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm', StringMid($sSelected_Text, $i, 1))<>0 Then
		$bykva=StringMid($sSelected_Text, $i, 1)
		ExitLoop
	EndIf
Next

;определяем язык
	If $bykva='' Then Exit ; здесь нужно проверить текущую раскладку на случай если язык не определён
	 ; если последний валидный символ принадлежит русскому языку, то меняем на англ.
	If StringInStr("ёйцукенгшщзхъфывапролджэячсмитьбю", $bykva)<>0 Then
		For $i = 1 to $aSplitTextArr[0]
			$n = _ArraySearch($aRu, $aSplitTextArr[$i], 1)
			If @error<>0 Then
				$New_Text&=$aSplitTextArr[$i]
			Else
				$New_Text&=$aEn[$n]
			EndIf
		Next
	EndIf
	
	 ; если последний валидный символ принадлежит английскому языку, то меняем на русс.
	If StringInStr("qwertyuiopasdfghjklzxcvbnm", $bykva)<>0 Then
		For $i = 1 to $aSplitTextArr[0]
			$n = _ArraySearch($aEn, $aSplitTextArr[$i], 1)
			If @error<>0 Then
				$New_Text&=$aSplitTextArr[$i]
			Else
				$New_Text&=$aRu[$n]
			EndIf
		Next
	EndIf
	
	ClipPut($New_Text) ; отправляем в буфер
	Sleep(10)
	Send("+{INS}") ; вставляем из буфера
EndFunc

Func _SendEx($sSend_Data)
	Local $hUser32DllOpen = DllOpen("User32.dll")
	While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
		Sleep(10)
	WEnd
	Send($sSend_Data)
	DllClose($hUser32DllOpen)
EndFunc

Func _Quit()
    Exit
EndFunc


И ещё, я хотел попробовать добавить проверку пробела слева от заменяемого текста, а то уже достаёт ручное выделение текста если в тексте есть символы точек, скобок и пр.


Yashied [?]
Везде один плагиат... Шутка.
если получится написать прогу "поиск дубликатов", тоже плагиатом будет... у KaFu на autoitscript.com уже имеется.

Что-то у меня не работает

Код:
#Include <GuiEdit.au3>	
$WinList = WinList()
For $i = 1 to $WinList[0][0]
  If $WinList[$i][0] <> "" AND BitAnd( WinGetState($WinList[$i][1]), 8 ) Then $hWnd=WinGetHandle ( $WinList[$i][1] )
Next
	$sel=_GUICtrlEdit_GetSel($hWnd)
MsgBox(0, 'Сообщение', $hWnd&@CRLF&$sel)
Exit


Пример в UDF тоже у меня не работает... в строке состояния не отображает выделенный текст.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
Что-то у меня не работает

Код:
#Include <GuiEdit.au3>	
$WinList = WinList()
For $i = 1 to $WinList[0][0]
  If $WinList[$i][0] <> "" AND BitAnd( WinGetState($WinList[$i][1]), 8 ) Then $hWnd=WinGetHandle ( $WinList[$i][1] )
Next
	$sel=_GUICtrlEdit_GetSel($hWnd)
MsgBox(0, 'Сообщение', $hWnd&@CRLF&$sel)
Exit

Вот этот вот код, это что такое?

:wacko:

AZJIO сказал(а):
Пример в UDF тоже у меня не работает... в строке состояния не отображает выделенный текст.

Потому, что файла "changelog.txt" в последних версиях AutoIt по этому пути нет. Замени его на "_ReadMe_.txt".
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Вот этот вот код, это что такое?

перевожу:
найти список окон вернуть имя активного ( 8 ) установить его хэндл, скормить хэндл функции _GUICtrlEdit_GetSel
Иначе в каком окне он будет брать выделение. Другую функцию поиска активного окна я не увидел в справках.

Потому, что файла "changelog.txt" в последних версиях AutoIt по этому пути нет. Замени его на "_ReadMe_.txt".
у меня в примере из справки нет намёков на changelog.txt

Нашёл changelog.txt но толку от него, он просто открывается. Я напечатал текст, какая разница, суть в том что выделенный текст не отображается в статусе.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В общем случае это делается немного по другому, вот простой пример. Выделяй где-нибудь текст и жми CTRL+T. Правда в некоторых Edit'ах это не будет работать. В этом случае есть _GUICtrlRichEdit_... функции.

Код:
#Include <GUIEdit.au3>
#Include <WinAPI.au3>

HotKeySet('^t', '_Test')

While 1
	Sleep(1000)
WEnd

Func _Test()

	Local $hWnd, $aID, $mID, $iPID, $aPos, $sText = ''

	$hWnd = _WinAPI_GetForegroundWindow()
	If $hWnd Then
		$aID = _WinAPI_GetWindowThreadProcessId($hWnd, $iPID)
		$mID = _WinAPI_GetCurrentThreadId()
		If _WinAPI_AttachThreadInput($aID, $mID, 1) Then
			$hWnd = _WinAPI_GetFocus()
			If $hWnd Then
				$aPos = _GUICtrlEdit_GetSel($hWnd)
				If (IsArray($aPos)) And ($aPos[0] <> $aPos[1]) Then
					$sText = StringMid(_GUICtrlEdit_GetText($hWnd), $aPos[0] + 1, $aPos[1] - $aPos[0] + 1)
				EndIf
			EndIf
			_WinAPI_AttachThreadInput($aID, $mID, 0)
		EndIf
	EndIf
	If $sText Then
		MsgBox(0, ':)', $sText)
	EndIf
EndFunc   ;==>_Test
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AZJIO [?]
таблица, из которой нужно придумывать как её использовать, мне кажется проще загнать обе раскладки в массив и сверять по индексу
Эта таблица и так загоняется в массив.

твою утилиту запустить не удалось
В чём проблема? (утилита кстати работает в тихом режиме).
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Что-то у меня вопросики возвращает на любом тексте, русский, английский. Хоткей поставил HotKeySet('!{F11}', '_Test'), Alt+F11, Ctrl+t занята.
 
Верх