Что нового

[Элементы GUI] Не понимаю, почему не определяет количество вкладок SysTabControl32 в Windows 7

seriych

Новичок
Сообщения
18
Репутация
0
Делал скрипт для очистки автозагрузки и отмечания только тех программ, которые есть в определенном списке (через msconfig). В XP и Vista работает, в семерке нет. Нашел проблемное место: _GUICtrlTab_GetItemCount в семерке возвращает ноль. Вот код, который в XP и Vista выводит количество вкладок, а в windows 7 выводит ноль (оставил только то, что влияет на суть проблемы):
Код:
#Include <GuiTab.au3>
#include <GUIConstants.au3>

$Title = "Конфигурация системы"          ; Заголовок окна (в XP надо "Настройка системы")
$FirstText = ""			; Текст в первом окне
AutoItSetOption( "WinTextMatchMode", 2)             ; Идентификация окна по произвольному фрагменту

; ...тут запуск msconfig и прочая фигня...
WinWaitActive ( $Title, "")

; Получаем заголовок TabControl
$h_tabcontrol = ControlGetHandle ( $Title, "", "[CLASS:SysTabControl32; INSTANCE:1]")
; Получаем количество вкладок
$i_TabItems = _GUICtrlTab_GetItemCount( $h_tabcontrol)
MsgBox ( 0, "", $i_TabItems)
Exit


проверил, что заголовок $h_tabcontrol соответствует тому, что выдает Au3Info.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Странно, нигде не пишут о проблемах с этим на Win7.

А _ControlTab UDF тоже не работает?
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
CreatoR сказал(а):
Странно, нигде не пишут о проблемах с этим на Win7.
А _ControlTab UDF тоже не работает?

_ControlTab работает точно также- в XP и висте нормально, в семерке обе функции выдают ноль (странно, что ноль а не -1). Но я тут обнаружил, что если отключить UAC, то в семерке тоже работает нормально. Меня-то это пока устроит, но вопросов возникает еще больше. Почему без отключения UAC не работает, хотя в висте и с UAC работает? Почему идентификатор контролтаба определяется без проблем, а количество вкладок уже нет? Почему возвращается именно ноль?

P.S. Забыл добавить. Батник, который запускает автоит, пробовал запускать от имени администратора- результат тот же во всех тестах.
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
Немного потестировал. Оказалось, что проходит определенное время от активации окна до полной отрисовки всех его элементов (на висте с семеркой это дольше, так как больше визуальных эффектов). Поэтому нужно вставить паузу после активации окна. Пауза решила почти все проблемы. Но возникли другие :smile: На большинстве компов работает, но вот есть один, на котором не пашет. Все, сделал, как на других: отключил UAC, ребутнулся, запустил скрипт и...
1) Run("C:\Windows\System32\msconfig.exe") срабатывает вхолостую, а если сделать ShellExecute("C:\Windows\System32\msconfig.exe"), то выдается ошибка "файл не найден". Хотя файл есть и именно там (Вставляем C:\Windows\System32\msconfig.exe в строку проводника- работает).
2) Решил запустить msconfig вручную. Теперь скрипт количество вкладок табконтрола определяет, но вкладку "Автозагрузка" не находит, хотя она такая же, как и на других компах (Au3Info тоже не видит отличий).

Я работаю с новыми компами с предустановленной осью и фирменным софтом (компы депо, асер, ноуты самсунг, асер, hp...). Глюк остался только на ноуте acer. На нем стоит таже ось и тот же антивирь, что и на самсунгах, на которых все работает. Не понимаю :(

3) Хотелось бы заставить работать и при включенном UAC. (кстати, мне, видимо приснилось, что у меня на висте работало при включенном UAC- сегодня не работало)
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
Долго копался, пытаясь найти, в чем ошибка. Пытался разными методами. Набрел на одну вещь, которая может прояснить ситуацию. Но сам разобраться не смог, так как не знаю, как работать с dll. Итак. Если использовать Вашу библиотеку _ControlTab.au3, то функция _ControlTab () с разными параметрами ведет себя по-разному. "GetTabsCount" срабатывает, а "GetItemText" выдает ошибку. Причем код ошибки @error после выполнения "GetItemText" равен нулю (как будто все нормально). На этот раз ошибка выдается в любой ОС. Вот код для примера:

Код:
#include "_ControlTab.au3"
$Title = "Настройка системы"          ; Заголовок окна в XP
;$Title = "Конфигурация системы"          ; Заголовок окна в Vista\Win7
; Запускаем свойства системы и ждем появления окна
Run( "C:\WINDOWS\pchealth\helpctr\binaries\msconfig.exe") ; XP
;Run("C:\Windows\System32\msconfig.exe") ; Vista
WinWait ( $Title, "")
WinActivate ( $Title, "")
WinWaitActive ( $Title, "")
Sleep (1000)
$h_Wnd = WinGetHandle ( $Title, "") ; Получаем заголовок окна
; количество вкладок
$i_TabItems = _ControlTab( $h_Wnd, "", "GetTabsCount")
MsgBox ( 0, "", $i_TabItems)
; текст первой вкладки
$sTabText = _ControlTab( $h_Wnd, "", "GetItemText", 0)
MsgBox ( 0, "", @error)
Exit


Этот скрипт выдает сначала окошко с количеством вкладок (правильно в любой ОС). Потом выдается ошибка Windows "msconfig.exe - обнаружена ошибка. Приложение будет закрыто..." После убийства отладчика через диспетчер задач выдается окошко с кодом ошибки 0, то есть как будто функция _ControlTab( $h_Wnd, "", "GetItemText", 0) сработала без ошибок. Я обнаружил, что ошибку вызывает следующая строка в _ControlTab.au3 :
Код:
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEM, "int", $sParam1, "int", $pItem)

(если перед ней поставить Exit, то ошибки нет, если после нее, то ошибка) Тут мои познания заканчиваются- что вызывает ошибку, я не понимаю.

Функции из GuiTab.au3 продолжают не работать на ноуте acer. Там 64 битная винда, может в этом дело, хотя не понятно, какая разница.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код в первом посте. Возвращает число вкладок 5, если добавить #RequireAdmin в скрипт
Код в последнем посте. У меня не срабатывает в обоих случаях (0 и 0). msconfig продолжает спокойно работу.
 
Верх