ADN Open CIS
Сообщество программистов Autodesk в СНГ

26/09/2013

Как реагировать на клавиши курсора (без передачи их в AutoCAD) используя ObjectARX?

В ObjectARX вы можете добавить фильтр в функцию обработки окна AutoCAD (можно использовать PInvoke для использования этой функциональности в .NET).

Следующий пример показывает как можно перехватывать и фильтровать клавиши и не позволить AutoCAD’у обрабатывать эти клавиши в командной строке (возвращая TRUE из filterCurs()). Он использует функцию acedRegisterFilterWinMsg() для регистрации хука и функцию acedRemoveFilterWinMsg() для отказа от регистрации хука...

Код - C++: [Выделить]
  1. #include "rxmfcapi.h"
  2.  
  3. static BOOL cursDone = FALSE;
  4. // После вызова этой функции AutoCAD будет использовать
  5. // функцию filterCurs() для обработки нажатия клавиш.
  6. //-----------------------------------------------------------------
  7. void curskeys()
  8. {
  9.   if( TRUE == cursDone ) // Хук установлен??
  10.     return;
  11.   acutPrintf( _T("Фильтрация клавиш включена...\n") );
  12.   if( FALSE == acedRegisterFilterWinMsg( filterCurs ) )
  13.     acutPrintf( _T("Не могу зарегистрировать хук обработки клавиатуры!\n"));
  14.   else
  15.     cursDone = TRUE;
  16. }
  17.  
  18. // Прекращение использования filterCurs() для обработки клавиш
  19. //------------------------------------------------------------------
  20. void nocurskeys()
  21. {
  22.   if( TRUE == cursDone )
  23.   {
  24.     acedRemoveFilterWinMsg( filterCurs );
  25.     cursDone = FALSE;
  26.   }
  27. }
  28. // В этой функции ваше приложение может управлять обработкой
  29. // нажатий некоторых клавиш или оставить их обработку AutoCAD.
  30. //-------------------------------------------------------------------
  31. BOOL filterCurs( MSG *pMsg )
  32. {
  33.   if( WM_KEYDOWN == pMsg->message && pMsg->wParam >= 37 && pMsg->wParam <= 40 )
  34.   {
  35.     switch( pMsg->wParam )
  36.     {
  37.     case 37: // Влево
  38.       acutPrintf( _T("Влево\n") );
  39.       break;
  40.     case 38: // Вверх
  41.       acutPrintf( _T("Вверх\n") );
  42.       break;
  43.     case 39: // Вправо
  44.       acutPrintf( _T("Вправо\n") );
  45.       break;
  46.     case 40: // Вниз
  47.       acutPrintf( _T("Вниз\n") );
  48.       break;
  49.     }
  50.     return TRUE; // Отфильтровываем сообщения
  51.   }
  52.   return FALSE;
  53. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/06/how-to-react-to-the-cursor-keys-properly-without-affecting-autocad-using-objectarx.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=230

Опубликовано 26.09.2013