Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745

Как узнать состояние CheckBox в чужом окне

21.09.2014, 12:47. Показов 4208. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Подскажите, плз, как программно определить наличие галочки в чужом CheckBox
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2014, 12:47
Ответы с готовыми решениями:

Как изменить состояние многих CheckBox на форме в один прием
Товарищи, наверное нубский вопрос, но если у меня есть 25 чекбоксов (0-24 соответственно), то как мне перечислить их с 0 до 19, чтобы не...

Символ под курсором в чужом окне
день добрый, спецам. сразу прошу прощения за возможно ламерский вопрос. а вопрос вот в чём - надо прописать в своём textbox'се символ из...

Как узнать состояние привода CD-ROM
Здравствуйте Гуру! Подскажите плз, как узнать состояние (открыт/закрыт) CD-ROM?

38
bite
 Аватар для I can
5011 / 4841 / 852
Регистрация: 13.04.2015
Сообщений: 10,122
11.01.2022, 16:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от VBOrion Посмотреть сообщение
а обычными BM_GETCHECK сообщениями не работает? Зачем эти усложнения с COM?
Тему читал? C дотнетовскими чекбоксами не сработает.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
11.01.2022, 20:49
Send- и PostMessage не хотят корректно работать с такими хитропопыми объектами. А вышеприведенный код не хочет работать на 64-битной Винде. По крайней мере, пока его не допилят до нужной кондиции. Короче, засада
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
11.01.2022, 21:02
Цитата Сообщение от _shark Посмотреть сообщение
Send- и PostMessage не хотят корректно работать с такими хитропопыми объектами. А вышеприведенный код не хочет работать на 64-битной Винде. По крайней мере, пока его не допилят до нужной кондиции. Короче, засада
Ну по возвращаемым значениям что? Что возвращает DispCallFunc? Ты исправил смещения?
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
11.01.2022, 21:24
сорри, завтра днем отвечу. У меня и код, и программа, в которой пытаюсь узнать состояние чекбокса - всё на работе.
Смещения, точно помню, поправил. Но сдается мне, дело в процедуре AccessibleObjectFromWindow. Возвращаемый ею IAccessible - какой-то неопределенный. Я не знаю чему он должен быть равен.

Запускал и вашу утилитку - на Win10 64 она всегда uncheсked показывает. Хотя имя класса определяет правильно. Где копать - хз, причин может быть много. Начиная с правильности строковой константы IID_IAccessible, и заканчивая правильной декларацией перечисленных dll-функций. Читал, что могут повлиять и права доступа
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
13.01.2022, 10:22
The trick, добрый день!
Смещения исправил, вызываю функцию так:
Visual Basic
1
Call DispCallFunc(ObjPtr(obj), 112, CC_STDCALL, vbLongLong, 2, types(0), param(0), VarRtn)
VarRtn на выходе равно &h80070057
после вызова значения равны вот чему: (см. картинку)
Миниатюры
Как узнать состояние CheckBox в чужом окне  
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
13.01.2022, 13:32
Цитата Сообщение от _shark Посмотреть сообщение
VarRtn на выходе равно &h80070057
В общем глянул на 64 битах, там нужно явно приводить параметр VarID к типу Long:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Option Explicit
 
Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _
                                 ByVal hwnd As OLE_HANDLE, _
                                 ByVal dwId As Long, _
                                 ByRef riid As Any, _
                                 ByRef ppvObject As Object) As Long
Private Declare PtrSafe Function IIDFromString Lib "ole32" ( _
                                 ByRef lpsz As Any, _
                                 lpiid As Any) As Long
Private Declare PtrSafe Function DispCallFunc Lib "oleaut32" ( _
                                 ByVal PPV As IUnknown, _
                                 ByVal oVft As LongPtr, _
                                 ByVal cc As Long, _
                                 ByVal rtTYP As Long, _
                                 ByVal paCNT As Long, _
                                 paTypes As Any, _
                                 paValues As Any, _
                                 ByRef fuReturn As Variant) As Long
 
Private Const IID_IAccessible       As String = "{618736e0-3c3d-11cf-810c-00aa00389b71}"
Private Const OBJID_CLIENT          As Long = -4
Private Const CC_STDCALL            As Long = 4
Private Const STATE_SYSTEM_CHECKED  As Long = &H10
 
Private Function GetCheckState( _
                 ByVal hwnd As OLE_HANDLE) As Boolean
    Dim iid(15)     As Byte
    Dim IAccessible As IUnknown
    Dim hr          As Long
    
    hr = IIDFromString(ByVal StrPtr(IID_IAccessible), iid(0))
    If hr < 0 Then
        Err.Raise hr
    End If
    
    hr = AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, iid(0), IAccessible)
    If hr < 0 Then
        Err.Raise hr
    End If
     
    GetCheckState = (IAccessibleGet_accState(IAccessible, 0&) And STATE_SYSTEM_CHECKED)
 
End Function
 
Private Function IAccessibleGet_accState( _
                 ByVal obj As IUnknown, _
                 ByVal VarID As Variant) As Variant
    Dim types() As Integer, param() As LongPtr
    Dim hr  As Long, vhr As Variant
    
    ReDim types(1): ReDim param(1)
    
    types(0) = vbVariant: types(1) = vbString
    param(0) = VarPtr(VarID): param(1) = VarPtr(IAccessibleGet_accState): IAccessibleGet_accState = param(1)
    
    hr = DispCallFunc(obj, 112, CC_STDCALL, vbLong, 2, types(0), param(0), vhr)
    
    If hr < 0 Then
        Err.Raise hr
    ElseIf vhr < 0 Then
        Err.Raise hr
    End If
    
End Function
1
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
13.01.2022, 15:05
The trick, спасибо за помощь. Если не трудно, перекомпилируйте, пожалуйста, в exe-файл предыдущую утилитку, но теперь уже с этим 64битным кодом. Просто, чтобы убедиться, что код действительно работает. У меня здесь нет компилятора, код запускаю из под VBA. А тут даже типа OLE_HANDLE нет. Так-то понятно, что это указатель
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
13.01.2022, 15:08
_shark, на чем я скомпилирую 64 битный код? Этот пример я в VBA и сделал.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
13.01.2022, 15:42
The trick, блин, точно. VB6 не поддерживает 64-битники, а выше уже всякие VB.Net-ы и студии. Понял, спасибо
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
14.01.2022, 11:52
The trick, день добрый!
К сожалению, ваш код содержит несколько ошибок и не работает.
в строке IIDFromString Lib "ole32" (ByRef lpsz As Any наверное, лучше поставить IIDFromString Lib "ole32" (ByVal lpsz As Any раз уж передается адрес строки.
DispCallFunc Lib "oleaut32" (ByVal PPV As IUnknown, ByVal oVft As LongPtr, ByVal cc As Long, ByVal rtTYP As Long, ByVal paCNT As Long, ByVal paTypes As Any, ByVal paValues As Any, ByRef fuReturn As Variant) As Long
здесь шестым параметром идет ByVal paTypes As Any, но VBA ругается на несоответствие типов, когда функции передается параметр types(0), равный Integer. Если заменить ByVal paTypes As Integer, то VBA вылетает. Решением является замена ByVal paTypes As Any, ByVal paValues As Any на ByRef в обоих параметрах, раз уж передаются адреса массивов.
Но в конечном итоге код все равно возвращает неправильное значение.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2022, 12:14
Цитата Сообщение от _shark Посмотреть сообщение
IIDFromString Lib "ole32" (ByRef lpsz As Any наверное, лучше поставить IIDFromString Lib "ole32" (ByVal lpsz As Any раз уж передается адрес строки.
Не лучше. ByVal мы всегда можем указать в коде, а вот ByRef нет.

Цитата Сообщение от _shark Посмотреть сообщение
DispCallFunc Lib "oleaut32" (ByVal PPV As IUnknown, ByVal oVft As LongPtr, ByVal cc As Long, ByVal rtTYP As Long, ByVal paCNT As Long, ByVal paTypes As Any, ByVal paValues As Any, ByRef fuReturn As Variant) As Long
здесь шестым параметром идет ByVal paTypes As Any, но VBA ругается на несоответствие типов, когда функции передается параметр types(0), равный Integer. Если заменить ByVal paTypes As Integer, то VBA вылетает. Решением является замена ByVal paTypes As Any, ByVal paValues As Any на ByRef в обоих параметрах, раз уж передаются адреса массивов.
Но в конечном итоге код все равно возвращает неправильное значение.
Объявление у меня правильное. Очень редко когда нужно передавать ByVal As Any. Он на то и Any чтобы туда передать любой параметр, а среда автоматом передавала указатель, а не значение.

Цитата Сообщение от _shark Посмотреть сообщение
Но в конечном итоге код все равно возвращает неправильное значение.
Какое значение? Приложи свой проект целиком, гадать можно долго, у меня в 64 битном офисе код работает.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
14.01.2022, 13:32
еще раз полностью скопировал ваш код в отдельный модуль, пришлось, правда, везде исправить OLE_HANDLE на LongPtr (надеюсь, не в этом причина неудачи), все остальные декларации прошли. Через Spy++ получил хендл нужного отмеченного чекбокса, запустил код и все равно выдало False

Visual Basic
1
2
3
4
5
6
Private Sub TestAccess()
Dim hwnd As LongPtr
    hwnd = &H1053C
    Debug.Print Hex(hwnd) & "h"
    Debug.Print GetCheckState(hwnd)
End Sub
Миниатюры
Как узнать состояние CheckBox в чужом окне  
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2022, 13:41
_shark, что возвращает IAccessibleGet_accState?
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
14.01.2022, 14:47
The trick, DispCallFunc возвращает ноль

IAccessibleGet_accState становится равным 1048576
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2022, 14:52
Цитата Сообщение от _shark Посмотреть сообщение
IAccessibleGet_accState становится равным 1048576
Значит функция отрабатывает верно. 1048576 - STATE_SYSTEM_FOCUSABLE
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
14.01.2022, 15:18
о, это радует. Хоть более-менее работает. Если бы еще как-то состояние получить "отмечен/не отмечен"
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2022, 15:24
_shark, ну вообще поменяй состояние и посмотри что меняется в возвращаемом значении. Мб ты не тот HWND передаешь, я не знаю. Попробуй на другом чекбоксе, в другом приложении.
0
193 / 191 / 31
Регистрация: 11.10.2016
Сообщений: 610
19.01.2022, 21:50
The trick, добрый вечер!
Блуждая по разным древним форумам наткнулся на такой момент - один товарищ пишет, что код с использованием некоторых API-шных функций начинал корректно работать только, если запущен был в модуле формы. В стандартных модулях возвращалось 0. Не сталкивались с такой ситуацией?

Добавлено через 36 минут
в общем, это, действительно, так. Перенес код в модуль формы, и сразу заработало. Правда, возвращается &h100001 для отмеченного и &h100000 для неотмеченного, но это уже мелочи. Главное, что их теперь можно различать
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
19.01.2022, 22:11
_shark, ты что-то не то делаешь просто. Разницы нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2022, 22:11

Как при помощи VB можно узнать состояние соединения в данный момент?
Помогите, кто может… Исходные данные: в сети (50 компов) есть почтовый сервер (под NT 4.0) c Exchange Server (IP-адрес известен). К...

Узнать текст ToolTip-a контрола в чужом приложении ?
Чужое приложение (CorelDRAW), в нём есть до десятка контролов класса - &quot;Edit&quot;, причем местоположение их совершенно разное у разных юзеров,...

Как узнать позицию курсора в текстовом окне?
Подскажите пожалуйста кто знает, как узнать позицию курсора в текстовом окне. Заранее благодарна всем кто ответит.

Как узнать текущее положение курсора в текстовом окне ???
Смотрите сабж.. нужно позарез ))

Как узнать, что в другом окне кликнул юзер?
У меня вопрос: есть ли способ узнать что юзер кликнул ссылку в другом окне (браузер)? Ну или вообще есть ли способ узнать о том что-нибудь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru