Что нового

Функция ControlListView и диспетчер задач

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Из всего набора команд, доступных в функции ControlListView работает только
Код:
ControlListView ( "Диспетчер задач Windows", "", "SysListView321", "GetItemCount")
. Остальные выдают -1, или вовсе крешат диспетчер задач (например,
Код:
MsgBox(0, "", ControlListView("Диспетчер задач Windows", "", "SysListView321", "GetText", 1))
. В чем может быть проблема? ОС win 7.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Учтя замечания, сообщаю следующее:
Код:
WinActivate("Диспетчер задач Windows")

MsgBox(0, "GetItemCount", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "GetItemCount")) 				;Это работает
MsgBox(0, "GetSelected", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "GetSelected"))					;Это работает
MsgBox(0, "GetSelectedCount", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "GetSelectedCount"))		;Это работает
MsgBox(0, "GetSubItemCount", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "GetSubItemCount"))			;Это работает
MsgBox(0, "IsSelected", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "IsSelected", 7))					;Это работает

MsgBox(0, "FindItem", ControlListView( "Диспетчер задач Windows", "", "SysListView321", "FindItem", "AutoIt3Help.exe", 1)) 	;Это крешит и после
																															;закрытия диспетчера
																															;задач отображает -1

MsgBox(0, "GetText", ControlListView("Диспетчер задач Windows", "", "SysListView321", "GetText", 2, 2))						;Это крешит и после
																															;закрытия диспетчера
																															;задач отображает пустую строку

Вопрос остается прежним.
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Причина, в общем, понятна, но как бороться не знаю. Дело, по всей видимости, с 64 битной системой Windows. Попробовал то же самое на Win7x32 - работает все, за исключением Find Item, но хотя бы не крешится.


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

Причина точно в 64 битной операционной системе. Работает и Find Item, просто не учел, что нумерация столбцов начинается с 0.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
vitaliy4us [?]
по всей видимости, с 64 битной системой Windows
Ну там видимо не SysListView32, там должен быть другой класс элемента.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Впрочем в справке есть об этом упоминание:

Примечания
Некоторые команды не выполняются, когда используется 32-разрядный процесс AutoIt с применением к 64-разрядному процессу. Аналогично некоторые команды не выполняются когда используется 64-разрядный процесс AutoIt с применением к 32-разрядному процессу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
vitaliy4us,
У меня все работает и на 32, и на 64 (Win7).
Код:
$iErr = 1
$sMsg = ''
$sProcess = 'taskmgr.exe'
Do
	$hWin = WinGetHandle('[Title:Диспетчер задач Windows; Class:#32770]')
	If Not $hWin Then
		Run($sProcess)
		$hWin = WinWait('[Title:Диспетчер задач Windows; Class:#32770]', '', 5)
	EndIf
	If Not $hWin Then ExitLoop
	$hTC = ControlGetHandle($hWin, '', '[CLASS:SysTabControl32; INSTANCE:1]')
	If Not $hTC Then ExitLoop
	$aRes = DllCall('user32.dll', 'lresult', 'SendMessageW', 'hwnd', $hTC, 'uint', 0x132F, 'wparam', 0, 'lparam', 0);$TCM_GETCURFOCUS
	If @error Then ExitLoop
	If $aRes[0] <> 1 Then
		DllCall('user32.dll', 'lresult', 'SendMessageW', 'hwnd', $hTC, 'uint', 0x1330, 'wparam', 1, 'lparam', 0);$TCM_SETCURFOCUS
		If @error Then ExitLoop
	EndIf
	$hLV = ControlGetHandle($hWin, '', '[CLASS:SysListView32; INSTANCE:1]')
	If Not $hLV Then ExitLoop
	$iTmp = ControlListView($hWin, '', $hLV, 'FindItem', $sProcess, 0)
	If @error Then ExitLoop
	$iCount = ControlListView($hWin, '', $hLV, 'GetSubItemCount')
	If @error Then ExitLoop
	For $i = 0 To $iCount - 1
		$sMsg &= ControlListView($hWin, '', $hLV, 'GetText', $iTmp, $i) & @TAB
		If @error Then ExitLoop 2
	Next
	$iErr = 0
Until 1
If $iErr Then
	Exit ConsoleWrite('error' & @LF)
Else
	ConsoleWrite(StringTrimRight($sMsg, 1) & @LF)
EndIf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
У меня все работает и на 32, и на 64 (Win7).
taskmgr.exe это 64-разрядный процесс, и скрипт запускается как 64-разрядный, вот и нету конфликта.
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Странно, скопировал ваш скрипт, но результат тот же (см. приложение). Пробовал также запускать скрипт (свой) как Run script(x64) и компилировать Compile script to exe (x64) с тем же успехом.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
vitaliy4us [?]
но результат тот же
А так?
Код:
$iErr = 1
$sMsg = ''
$sProcess = 'taskmgr.exe'
Do
	$hWin = WinGetHandle('[Title:Диспетчер задач Windows; Class:#32770]')
	If Not $hWin Then
		Run($sProcess)
		$hWin = WinWait('[Title:Диспетчер задач Windows; Class:#32770]', '', 5)
	EndIf
	If Not $hWin Then ExitLoop
	$hTC = ControlGetHandle($hWin, '', '[CLASS:SysTabControl32; INSTANCE:1]')
	If Not $hTC Then ExitLoop
	$aRes = DllCall('user32.dll', 'lresult', 'SendMessageW', 'hwnd', $hTC, 'uint', 0x132F, 'wparam', 0, 'lparam', 0);$TCM_GETCURFOCUS
	If @error Then ExitLoop
	If $aRes[0] <> 1 Then
		DllCall('user32.dll', 'lresult', 'SendMessageW', 'hwnd', $hTC, 'uint', 0x1330, 'wparam', 1, 'lparam', 0);$TCM_SETCURFOCUS
		If @error Then ExitLoop
	EndIf
	$hLV = ControlGetHandle($hWin, '', '[CLASS:SysListView32; INSTANCE:1]')
	If Not $hLV Then ExitLoop
	If StringInStr(@OSArch, '64') Then $sProcess &= ' *32'
	$iTmp = ControlListView($hWin, '', $hLV, 'FindItem', $sProcess, 0)
	If @error Or $iTmp < 0 Then ExitLoop
	$iCount = ControlListView($hWin, '', $hLV, 'GetSubItemCount')
	If @error Then ExitLoop
	For $i = 0 To $iCount - 1
		$sMsg &= ControlListView($hWin, '', $hLV, 'GetText', $iTmp, $i) & @TAB
		If @error Then ExitLoop 2
	Next
	$iErr = 0
Until 1
If $iErr Then
	Exit ConsoleWrite('error' & @LF)
Else
	ConsoleWrite(StringTrimRight($sMsg, 1) & @LF)
EndIf
Можно попробовать добавить в начало
Код:
#RequireAdmin
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
Вынужден вернуться к обсуждению этой темы, поскольку в последнее время еще несколько раз столкнулся с подобной проблемой. Похоже она касается всех системных окон Windows, а конкретнее элемента SysListView32 в этих окнах. При попытке прочитать что-либо из этого элемента при помощи функции ControlListView крэшится windows explorer. Например, открываю окно обновлений "Installed updates" и при помощи скрипта пытаюсь читать из элемента [CLASS:SysListView32; INSTANCE:1]:
Код:
ControlListView("Installed Updates", "",  "[CLASS:SysListView32; INSTANCE:1]", "GetText", 1, 2)

и все - Windows explorer тут же закрэшился. Что интересно, другие команды, используемые в этой функции, выполняются успешно (например, "GetItemCount" или "Select")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
vitaliy4us [?]
При попытке прочитать что-либо из этого элемента при помощи функции ControlListView крэшится windows explorer
Потому что скрипт x86 пытается получить доступ к памяти процесса x64. Запускайте/компилируйте как x64 и не будет проблем.

P.S
Код:
_GUICtrlListView_GetItemText

не крашит прроводник.
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
CreatoR сказал(а):
vitaliy4us [?]
При попытке прочитать что-либо из этого элемента при помощи функции ControlListView крэшится windows explorer
Потому что скрипт x86 пытается получить доступ к памяти процесса x64. Запускайте/компилируйте как x64 и не будет проблем.

P.S
Код:
_GUICtrlListView_GetItemText

не крашит прроводник.
Спасибо, проблему решает именно запуск скрипта как x64 приложения. А
Код:
_GUICtrlListView_GetItemText
из скрипта x86 действительно не крэшит проводник, но и текст не выводит.
 
Верх