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++ можно просматривать появляющиеся сообщения.