Что нового

ControlSend нескольким окнам одновременно

zykis

Новичок
Сообщения
3
Репутация
0
Мне нужно сделать так, чтобы метод ControlSend() эмулировал зажатие клавишы в нескольких окнах одновременно.
Следующий код делает это последовательно. Есть идеи?

Код:
Local $HWNDs = WinList("Unnamed - Notepad")
Opt("SendKeyDownDelay", 7000)
For $i = 1 To $HWNDs[0][0]
   ControlSend($HWNDs[$i][1], "", "", "f")
Next
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Скомпиль на каждое окно по одному exe и запусти их одновременно :smile:.


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

Так же, если тебе нужно зажать только одну клавишу и надолго, можно просто воспользоваться например "{f DOWN}" циклично в каждое окно, а потом отжать. Непомню про ControlSend, но Send такое поддерживает
 

InnI

AutoIT Гуру
Сообщения
4,983
Репутация
1,461
Код:
Local $HWNDs = WinList("Unnamed - Notepad")
For $i = 1 To $HWNDs[0][0]
   ControlSend($HWNDs[$i][1], "", "", "{f down}")
Next
Sleep(7000)
For $i = 1 To $HWNDs[0][0]
   ControlSend($HWNDs[$i][1], "", "", "{f up}")
Next


Представленный вами скрипт не работает в неактивных окнах блокнота ;)
Конспиратор :smile:
 
Автор
Z

zykis

Новичок
Сообщения
3
Репутация
0
Скомпиль на каждое окно по одному exe и запусти их одновременно :smile:.
Если их - 5, то это уже гемор))
Приходится)))


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

Представленный вами скрипт не работает в неактивных окнах блокнота ;)
Действительно не работает. А также sleep() не помогает оставить клавишу зажатой - она сразу же отжимается :blink:
Что может быть не так?
 

InnI

AutoIT Гуру
Сообщения
4,983
Репутация
1,461
zykis [?]
Что может быть не так?
Если мы сейчас говорим о блокноте, который редактор текста, то для работы в нём нужно прописать контрол и тогда будет работать в неактивном (и даже в свёрнутом) окне
Код:
ControlSend($HWNDs[$i][1], "", "Edit1", "f")
Посмотрите при помощи Au3Info - возможно и у вашего "блокнота" есть контрол внутри окна.

Что касается "down/up"... В справке так и написано "только для игр". Обычные оконные элементы обрабатывают либо только "down", либо только "up". Поэтому в блокноте (редакторе), чтобы увидеть повторяющиеся буквы нужно в цикле отправлять "f".

Ну и ещё один момент. Многие игры, ой, "блокноты" просто не обрабатывают нажатия и клики, если их окно не активно.
 
Автор
Z

zykis

Новичок
Сообщения
3
Репутация
0
Многие игры, ой, "блокноты" просто не обрабатывают нажатия и клики, если их окно не активно.
Это игровой клиент. И он обрабатывает просто "w", но не обрабатывает "{w down}".
Или так и должно быть или я косякнул с кодом. Судя по тому, что Вы говорите - первое.
P.S.: Хотя при встрече
Код:
ControlSend($HWND, "", "", "{w down}")
он всё-таки заметно дергается. Видимо сообщение всё-таки приходит... Я в смятении.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Как то делал нечто подобное:

Код:
Global $iTop = 30
Global $aInstances[6][3] = [[5]]
Global $sSet_Data = 'Notepad Instance #%i'
Global $sNotepad_WinCLASS = '[REGEXPCLASS:Notepad.*]'
Global $sNotepad_EditCLASS = 'Edit1'

$hGUI = GUICreate('__Simultanius_Run_Handling_GUI__')
$nEdit = GUICtrlCreateEdit('', 0, 0, 200, 200)

For $i = 1 To $aInstances[0][0]
	$iNotepad_PID = Run('Notepad.exe')
	If @error Then ContinueLoop
	
	While 1
		$aWinList = WinList($sNotepad_WinCLASS)
		
		For $x = 1 To UBound($aWinList) - 1
			If WinGetProcess($aWinList[$x][1]) = $iNotepad_PID Then
				$hNotepad = $aWinList[$x][1]
				ExitLoop 2
			EndIf
		Next
	WEnd
	
	If Not IsHWnd($hNotepad) Then ContinueLoop
	
	$aWin_Pos = WinGetPos($hNotepad)
	WinMove($hNotepad, '', $aWin_Pos[0], $iTop)
	
	$iTop += 100
	
	$sRun_Script_Content = _
		'#NoTrayIcon' & @CRLF & _
		'While ControlGetText(Hwnd(' & $hGUI & '), "", "Edit1") <> "Notepad Instances = ' & $aInstances[0][0] & '"' & @CRLF & _
		'	Sleep(10)' & @CRLF & _
		'WEnd' & @CRLF & _
		'ControlSetText(Hwnd(' & $hNotepad & '), "", "' & $sNotepad_EditCLASS & '", "EditPaste", StringFormat("' & $sSet_Data & '", ' & $i & '))' & @CRLF
	
	$sFile = @TempDir & '\~Au3_Run_' & $i & '.Tmp'
	
	$hFOpen = FileOpen($sFile, 2)
	FileWrite($hFOpen, $sRun_Script_Content)
	FileClose($hFOpen)
	
	$iAU3_PID = Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sFile & '"')
	
	If $i = $aInstances[0][0] Then
		MsgBox(64, 'Attention...', 'Now we will see the data set almost in the same time in all [' & $i & '] Notepads...', 3)
		Sleep(500)
	EndIf
	
	GUICtrlSetData($nEdit, 'Notepad Instances = ' & $i)
	
	$aInstances[$i][0] = $iNotepad_PID
	$aInstances[$i][1] = $iAU3_PID
	$aInstances[$i][2] = $sFile
Next

Sleep(2000)
MsgBox(64, 'Attention...', 'Now we need to clean a little :) (delete temporary files and close Notepad windows)...', 5)

Opt('WinWaitDelay', 10)

For $i = $aInstances[0][0] To 1 Step -1
	ProcessClose($aInstances[$i][0])
	ProcessClose($aInstances[$i][1])
	FileDelete($aInstances[$i][2])
Next
 
Верх