Стили окон и поиск по стилю - проблемка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Стили окон и поиск по стилю - проблемка

Сообщение Eugenio » 06.04.2007 (Пт) 13:16

Доброго времени суток.
Простите, туплю. Не могу сообразить. Как задаются стили окна, если не сложением значений нескольких констант?
Наблюдаю вот щас интересную картину:
в списке Spy++ перечислены несколько окон, принадлежащих опред. процессу, среди значений стиля которых есть WS_VISIBLE.
Но когда я вызываю EnumThreadWindows, то (в callback функции) обнаруживается, что у этих же самых окон
Код: Выделить всё
GetWindowLong(lhWnd, GWL_STYLE) And WS_VISIBLE = 0

Пните в нужном направлении, пожалуйста, че не так.
Есть ли у меня вопрос? У меня всегда есть вопрос

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.04.2007 (Пт) 15:21

Код: Выделить всё
If (WS_VISIBLE And GetWindowLong(lhWnd, GWL_STYLE)) = WS_VISIBLE Then
    MsgBox "WS_VISIBLE!"
Else
    MsgBox "Not WS_VISIBLE!"
End If

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.04.2007 (Пт) 15:27

Достаточно было сказать только то, что не учтён приоритет операторов.

= имеет больший приоритет чем And.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.04.2007 (Пт) 19:38

Хакер писал(а):Достаточно было сказать только то, что не учтён приоритет операторов.

= имеет больший приоритет чем And.

Да нет же, имелось в виду, что 0 - результат вычисления выражения
Код: Выделить всё
WS_VISIBLE And GetWindowLong(lhWnd, GWL_STYLE))
!
Так, что как ни проверяй, Amed, результат будет такой же. Пардон, что непонятно написал.
Я и спрашиваю-то, собсно, почему у меня результат равен 0, если, скажем, в Spy++ флаг WS_VISIBLE выставлен?
Может, стили как-то запакованы там хитрее, чем просто сложением (OR)?
А, люди?
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2007 (Пт) 19:42

Eugenio, фтыкай приведённые ответы.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.04.2007 (Пт) 20:06

GSerg писал(а):Eugenio, фтыкай приведённые ответы.

Фтыкай в приведенные вопросы!
Я не понял. Если бы результат бал равен чему-то, кроме нуля, я бы сам, безо всякого MsgBox'а, воскликнул бы "Visible!". Но отладчик показывает:
Expression
WS_VISIBLE And GetWindowLong(lhWnd, GWL_STYLE))
Value
0
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2007 (Пт) 20:10

Eugenio, ты в курсе, что упорно цитируемое тобой WS_VISIBLE And GetWindowLong(lhWnd, GWL_STYLE)) тупо не скомпилируется из-за несоответствия скобок? Скопируй код из реальной программы, а? А то ты реально не видишь разницы, похоже, хотя тебе на неё указали выше.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.04.2007 (Пт) 20:20

Да, пардон. Вот оно:
Код: Выделить всё
            If CBool(GetWindowLong(lhWnd, GWL_STYLE) And WS_VISIBLE) Then
                ReDim Preserve ProcessWindowsHandles(0 To UBound(ProcessWindowsHandles) + 1)
                ReDim Preserve ProcessWindowsCaps(0 To UBound(ProcessWindowsHandles) + 1)
                ProcessWindowsHandles(UBound(ProcessWindowsHandles)) = lhWnd
                ProcessWindowsCaps(UBound(ProcessWindowsHandles)) = left(lpString, lngActualLength)
                Exit Function
            End If

Содержимое скобок я вынес в табло, когда увидел, что прога "не зашла вусловие". И увидел 0. И удивился. И посмотрел в Spy++. И нашел там то же окно, и увидел WS_VISIBLE. И стало мне непонятно.
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2007 (Пт) 20:38

При правильном lhWnd (проверял?) это выражение будет равно WS_VISIBLE, если окно действительно видимо.
У меня равно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 06.04.2007 (Пт) 20:55

Ну, похоже как-то вышло, что при неправильном. Но ведь в EnumWindowsProc только один hwnd.
Ну, я извиняюсь, народ. И персонально Шаман.
Вот сейчас смотрю - нормально всё.
Посыпаю голову пеплом.
Есть ли у меня вопрос? У меня всегда есть вопрос


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 104

    TopList