Что нового

[Окна, Диалоги] Активировать нужное окно Excel при нескольких открытых

Dm666

Осваивающий
Сообщения
221
Репутация
48
Дамы и господа, всем доброго!

Никак не могу победить, при нескольких открытых книгах Excel могу активировать только последнюю активную.
Скажем, имеем открытыми
aaaa.xlsx
bbbb.xlsx
cccc.xlsx

bbbb.xls была последней активной, WinActivate("aaaa") так же как и WinActivate("сссс") все равно активирует bbbb :(

Ладно, идем другим путем, ловим дескриптор:
Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <WinAPI.au3>

;~ WinActivate("aaaa")

Local $iArraySize = 1, $i = 0, $aWinList[$iArraySize][4] = [[0]]

$hWnd = DllCall("user32.dll", "hwnd", "FindWindow", "int", 0, "int", 0)
If Not @error Then
	$hWnd = $hWnd[0]
EndIf
While $hWnd
	$i += 1
	If $i >= $iArraySize Then
		$iArraySize = $i * 2
		ReDim $aWinList[$iArraySize][4]
	EndIf
	$aWinList[$i][0] = $hWnd ; Дескриптор
	$aWinList[$i][1] = _WinAPI_GetWindowText($hWnd) ; Заголовок
	$aWinList[$i][2] = _WinAPI_GetClassName($hWnd) ; Класс
	If BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $WS_VISIBLE) Then
		$aWinList[$i][3] = 'Видимо'
	Else
		$aWinList[$i][3] = 'Скрыто'
	EndIf
	$hWnd = _WinAPI_GetWindow($hWnd, $GW_HWNDNEXT)
WEnd
If $i Then
	ReDim $aWinList[$i + 1][4]
	$aWinList[0][0] = $i
EndIf
;~  _ArrayDisplay($aWinList, 'Результат', -1, 0, '', '|', '№|Дескриптор|Заголовок|Класс|Видимость')


For $i = 0 To UBound($aWinList) -1
	If StringInStr($aWinList[$i][1], "aaaa") Then 
		ConsoleWrite('-> ' & $aWinList[$i][1] & @CRLF)
		WinActivate($aWinList[$i][0]) ;descriptor
		Exit
	EndIf
Next


Все равно активирует bbbb :wall_brake: Вот тут у меня идеи закончились.
Возможно ли вообще активировать aaaa, или я странного хочу?

PS: Excel 2010, Win 7 x64
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include 'array.au3'
$str=WinList('[REGEXPTITLE:.*xls]','')
;~ _ArrayDisplay($str)
WinActivate($str[1][1])
Sleep(1000)
WinActivate($str[2][1])
Sleep(1000)
WinActivate($str[3][1])
Sleep(1000)
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Спасибо! :thumbs_up:
Только вот поведение какое-то странное. Перебор одного за другим работает отлично, все прекрасно активируется. Но если пытаться выдернуть только какое-то одно окно и активировать его - фигвам (с)

Код:
#include 'array.au3'
$str=WinList('[REGEXPTITLE:.*xls]','')
_ArrayDisplay($str)

For $i = 2 To UBound($str) -1
	If StringInStr($str[$i][0], "aaa") Then 
		ConsoleWrite('-> ' & $str[$i][0] & @CRLF)
		WinActivate($str[$i][1])
	EndIf
	
;~ 	WinActivate($str[$i][1])
	
	Sleep(500)
Next


aaa в консоль пишет, но активировать не желает, активируется последнее. Решил приделыванием костыля в виде активирования окон одного за другим и выхода из цикла при совпадении заголовка, но все же интересно понять почему не работает по-нормальному, без костылей...
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
ConsoleWrite('-> ' & $str[$i][1] & @CRLF)

Смотришь hwnd у окон, смотришь на какое срабатывает
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Вроде как переменная одна и та же, и handle стало быть тот же. Ну да ладно, работает, и Аллах ему акбар! :smile:
Спасибо за помощь :beer:
 
Верх