Microsoft Visual C++: как посылать сообщения контролам, или как программно нажать кнопку |
![]() |
Добавил(а) microsin |
Часто бывает нужно программно выбрать одну из радиокнопок, или прокрутить листбокс. Обычно это делается с помощью посылки сообщения хендлу окна нужного контрола (листбокс, чекбокс, кнопка, радиокнопка и т. д.). [Управление радиокнопкой] В этом примере показывается, как программно выбрать нужную радиокнопку. Имя Button - название класса окна радиокнопки, а Radio2 - текстовая надпись, принадлежащая нужной радиокнопке. CWnd *hTmp; hTmp = FindWindowEx(theApp.m_pMainWnd->m_hWnd, 0, "Button", "Radio2"); ::SendMessage(hTmp->m_hWnd, BM_CLICK, 0, 0); [Управление CEdit] Операции с многострочным окном редактирования CEdit. В этом примере переменная edVar привязана н контролу многострочного поля редактирования. ::SendMessage(edVar.m_hWnd, WM_VSCROLL, SB_BOTTOM, 0); Чтобы прокрутить текст на одну строку: ::SendMessage(edVar.m_hWnd, WM_VSCROLL, SB_LINEDOWN, 0); [Управление закладками] Пример манипулирования закладками. Переменная m_Tabs привязана к набору закладок CTabCtrl. NMHDR hdr; hdr.code = TCN_SELCHANGE; hdr.hwndFrom = m_Tabs.m_hWnd; SendMessage ( WM_NOTIFY, m_Tabs.GetDlgCtrlID(), (LPARAM)&hdr ); [Запуск программы, манипулирование окном программы] В следующем примере запускается программа putty и автоматически вводится логин и пароль: bool TelnetLogon (tDevParam cisco) { HWND hTmp; bool bTelnetFinded = false; char ch; CString csSendText; WinExec(csTelnetPath + " -telnet " + cisco.csIPadmin,SW_SHOW); for (int iTimeOut=10;iTimeOut!=0;iTimeOut--) { Sleep(100); hTmp = FindWindowEx(NULL, 0, "PuTTY", cisco.csIPadmin + " - PuTTY"); if (NULL != hTmp) { bTelnetFinded = true; break; } } //посылаем логин csSendText = cisco.csUserLogin + "\n"; if (bTelnetFinded) { for (int iCharIdx=0;iCharIdx<csSendText.GetLength();iCharIdx++) { ch = csSendText[iCharIdx]; ::SendMessage(hTmp, WM_CHAR, ch, 0x00000001); Sleep(10); } } else return false; //посылаем пароль csSendText = cisco.csUserPassword + "\n"; for (int iCharIdx=0;iCharIdx<csSendText.GetLength();iCharIdx++) { ch = csSendText[iCharIdx]; ::SendMessage(hTmp, WM_CHAR, ch, 0x00000001); Sleep(10); } return true; } [Отладка сообщений Windows] Отлаживать сообщения можно удобным инструментом Visual Studio - Spy++ (доступен через меню Tools\Spy++). У него в меню сначала выбираем Spy\Log Messages, где на первой закладке Windows с помощью Finder Tool выбираем контрол, у которого отслеживаем сообщения. Потом переключаемся на закладку Messages, где галочками отфильтровываем сообщения, которые надо показывать. Потом жмем OK, и жмем на тестируемые контролы. В окне Spy++ можно просматривать появляющиеся сообщения. |