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);
WinAPI: Принудительная нотификация, уведомления об изменении
Подскажите, пожалуйста, как заставить контрол обновить свое состояние или отправить от его имени уведомление, что он изменился?
Вот, к примеру, издевательство над калькулятором:
Код:
Должен по очереди проставить галачки на радиокнопка 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;
}
{
if (index < 0 || index >= Count)
return false;
Show(); // отображаем список айтемов
User32.SendMessage(parent.Handle, ComboBoxMessages.CB_SETCURSEL, index, 0);
parent.Click(); // щелкаем по айтему
return true;
}
Это ж форменное извращение! Конечно, я и в radiobutton'ах могу извратиться - вместо отправки сообщения об установке состояния, кликать по кнопке и считывать его состояние, пока оно не окажется Checked. Но так можно далеко зайти. Как бы все это очеловечить? Послать месагу от чужого имени, что злодей обновился - и все счастливы. Возможно ли это?
Код:
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
}
{
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 за помощь!