Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WinAPI: Принудительная нотификация, уведомления об изменении

9.7K
22 января 2012 года
Vitamant
228 / / 07.02.2011
Доброго времени суток!

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

Вот, к примеру, издевательство над калькулятором:
Код:
var win = WindowsObject.Wait<WindowsObject>(5000, "Калькулятор");
            var b1 = (RadioButton)win.GetChild<RadioButton>("Button", 5);
            var b2 = (RadioButton)win.GetChild<RadioButton>("Button", 6);
            var b3 = (RadioButton)win.GetChild<RadioButton>("Button", 7);
            var b4 = (RadioButton)win.GetChild<RadioButton>("Button", 8);
            b1.Checked = ButtonState.Unchecked;
            Thread.Sleep(1000);
            b2.Checked = ButtonState.Checked;
            Thread.Sleep(1000);
            b3.Checked = ButtonState.Checked;
            Thread.Sleep(1000);
            b4.Checked = ButtonState.Checked;
            Thread.Sleep(1000);

Должен по очереди проставить галачки на радиокнопка 8/4/2/1 байта. Все здорово - ставит. Но при этом калькулятор об этом не подозревает. Даже смежные RadioButton'ы не меняют своего состояния - хоть на все ставь!

Тоже самое, например, с ComboBox'ами при выборе элементов:
Код:
public bool Select(int index)
        {
            if (index < 0 || index >= Count)
                return false;

            Show(); // отображаем список айтемов
            User32.SendMessage(parent.Handle, ComboBoxMessages.CB_SETCURSEL, index, 0);
            parent.Click(); // щелкаем по айтему

            return true;
        }

Это ж форменное извращение! Конечно, я и в radiobutton'ах могу извратиться - вместо отправки сообщения об установке состояния, кликать по кнопке и считывать его состояние, пока оно не окажется Checked. Но так можно далеко зайти. Как бы все это очеловечить? Послать месагу от чужого имени, что злодей обновился - и все счастливы. Возможно ли это?
9.7K
22 января 2012 года
Vitamant
228 / / 07.02.2011
Вероятнее всего, отбой. Ответ нашел в исходниках AutoIT:
Код:
if ( strcmpi(szCmd,"SETCURRENTSELECTION")==0 )
        {
            if ( strnicmp(vParams[2].szValue(),"Combo",5)==0 )
            {
                vMsg = CB_SETCURSEL;
                xMsg = CBN_SELCHANGE;
                yMsg = CBN_SELENDOK;
            }
            if ( strnicmp(vParams[2].szValue(),"List",4)==0 )
            {
                vMsg = LB_SETCURSEL;
                xMsg = LBN_SELCHANGE;
                yMsg = LBN_DBLCLK;
            }
            if ( vMsg )
            {// Must be ComboBox or ListBox
                if ( SendMessage(m_ControlSearchHWND, vMsg, (WPARAM)vParams[4].nValue(), 0) == -1 )
                    SetFuncErrorCode(1);
                else
                {
                    SendMessage(GetParent(m_ControlSearchHWND),WM_COMMAND,(WPARAM)MAKELONG(GetDlgCtrlID(m_ControlSearchHWND),xMsg),(LPARAM)m_ControlSearchHWND);
                    SendMessage(GetParent(m_ControlSearchHWND),WM_COMMAND,(WPARAM)MAKELONG(GetDlgCtrlID(m_ControlSearchHWND),yMsg),(LPARAM)m_ControlSearchHWND);
                }
            }
            break;                          // SETCURRENTSELECTION performed, exit switch
        }

http://www.autoitscript.com/autoit3/files/archive/autoit/autoit-v3.1.0-src.exe

Спасибо Dreadfulangel за помощь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог