Начало | Новини | Помощ | Модули
| Media Max | Media Max Demo Поръчай Media Max | Въпроси | Изтегли | Контакти   

Media Max SDK


  Всяка програма която може да се управлява от Media Max трябва да има създаден за нея модул.
За момента има два вида модули за Media Max.

1. Модули за контролиране на програми.
2. Модули за управление на системни функции на операционната система.

  Превключването между двата вида модули (режими на работа) става с бутона "MODE" от пулта за дистанционно управление. При режим на работа "Application" Media Max работи само с модулите за управление на програми. В този режим Media Max следи чрез модулите дали има в момента стартирано приложение за което да има стартирам модул. През 1 секунда Media Max извиква за всеки модул функцията която се грижи за намиране на програмата за която е написан този модул. Ако тази функция открие, че в момента е активна програмата за която е написан съответния модул като резултат от нейното извикване връща "TRUE". Ако в момента няма стартирано приложение за което има модул тази функция връща резултат "FALSE". При положение, че някоя функция е върнала резултат "TRUE" Media Max започва да изпраща командите пристигащи от пулта за дистанционно управление към модула чиято функция за откриване на програмата е върнала резултат "TRUE". В даден момент Media Max може да изпраща командите от пулта само към един модул. Един модул е активен докато друг модул не поеме управлението. Това означава, че Media Max работи с последната активна програма, даже и ако в този момент тя не е на фокус. Ако някой модул открие програма за която е създаден, той става веднага активен докато някой друг модул не открие програмата за която е направен и не стане той активен.
  Режима в който се стартира Media Max е "Application". При натискане на бутона "MODE", Media Max започва да работи с първият системен модул който открие. Като пример може да кажем,че модула за симулиране на мишка е системен. При всяко следващо натискане на бутона "MODE", се зарежда следващия системен модул. Ако се превъртят всичките системни модули се преминава отново в режим "Application". Така с бутона "MODE" може да се превключва между всичките модули.   Media Max може да работи с 255 различни модула.


  Всеки един модул е DLL файл, който се зарежда при стартирането на Media Max.

   По долу е показан скелета на DLL файла, който представлява самия модул. В този код са отбелязани само основните части на DLL файла на един модул без да е показан код за отделните функции. Целта е да се покаже структурата на един модул и отделните функции на DLL библиотеката.



#include "definition.h"

//с тази структура се предават данни за модула към Media Max //някои от полетата не са задължителни struct plugindata { // HWND на прозореца на Media Max HWND mmhWnd; // HWND на контролираната програма HWND apphWnd; // HINSTANCE на DLL файла HINSTANCE dllhIns; // име на файла на управляваната програма char appfileName [MAX_STR_LEN]; // име на модула char pluginName [MAX_STR_LEN]; // име на програмата която се контролира char appName [MAX_STR_LEN]; // версия на модула char pluginversion [MAX_STR_LEN]; // описание на модула char description [MAX_STR_LEN]; // името с което ще се записва модула във INI файла //това име за задава от Media Max и е еднакво //с името на файла //без неговото разширение (*.dll) char keyname [MAX_STR_LEN]; // типа на модула // ако има стойност 1 - системен модул // ако има стойност 2 - модул за управляване на програми DWORD plugintype; }; //променлива от структурата за предаване на данни //между Media Max и модула plugindata myData; //деклариране на експортните функции на DLL файла extern "C" __declspec (dllexport) plugindata* GetPlugInData(); extern "C" __declspec (dllexport) void SetPlugInData(plugindata* data); extern "C" __declspec (dllexport) BOOL MessageProc(UINT message); extern "C" __declspec (dllexport) char* ScreenTextProc(UINT message); extern "C" __declspec (dllexport) BOOL IsAppRun(); extern "C" __declspec (dllexport) DWORD InitProc(); extern "C" __declspec (dllexport) DWORD QuitProc(); extern "C" __declspec (dllexport) DWORD ConfigProc(); //входната функция на DLL файла BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } //тази функция се извиква през 1 секунда от Media Max //и чрез нея се определя дали е активен програмата //за която е създаден този модул BOOL IsAppRun () { } // тази функция се извиква от Media Max за да се изведе //командата на монитора при натискане на бутон от пулта //за дистанционно управление char* ScreenTextProc (UINT message) { } //в тази функция се изпълняват необходимите действия //за да може всяко натискане на бутона от пулта за //дистанционно управление да се преобразува в команда //към съответната програма BOOL MessageProc (UINT message) { //ако няма валиден HWND към прозореца на контролираната //програма се излиза от функцията //прави се само изключение за командата "IR_STANDBY" //понеже при стартиране на самата програма от //бутона "STANDBY" //още няма валиден HWND } //предава на Media Max структурата с данните на модула plugindata* GetPlugInData () { } //с тази функция Media Max допълва данните //към структурата на модула void SetPlugInData (plugindata* data) { } // функция за инициализация на модула //извиква се от Media Max при зареждане на модула DWORD InitProc () { } //тази функция се извиква преди да се унищожи //модула от Media Max DWORD QuitProc () { } //тази функция се извиква когато ще се конфигурира модула DWORD ConfigProc () { }
 

  Структурата "pugindata" се използва за обмяна на данни между даден модул и Media Max. Една част от нейните полета се попълват от самия модул, а друга се попълва от Media Max при зареждането на този модул. Тази структура има следните полета :

     - mmhWnd - в това поле се записва HWND на прозореца на Media Max. Полето се попалва от Media Max.
     - apphWnd - в това поле се записва HWND на прозореца на контролираната програма, попълва се от модула.
     - dllhInst - HINSTANCE на DLL файла. Попълва се от Media Max при зареждането на модула.
     - appfileName - името на EXE файла на контролираната програма. Попълва се от модула. Това поле не е задължително.
     - pluginName - името на модула. С това име ще се покаже този модул в списъка с модули на диалога за настройки на Media Max. Попълва се от модула.
     - appName - името на програмата която ще се управлява. Попълва се от модула, не езадължително.
     - pluginversion - версията на модула. Попълва се от модула, не е задължително.
     - description - описание на модула. Попълва се от модула, не е задължително.
     - keyname - с това име се записват настройките на модула в INI файла на Media Max. Стойността на полето е еднаква с името на DLL файла, без разширението (.DLL). Попълва се от Media Max.
     - plugintype - Тип на модула. Може да приема за сега стойност - 1 или 2, в зависимост какъв тип модул искаме да направим. Полето се попълва от модула. Задължително е за попълване.

Един модул за Media Max трябва да съдържа следните задължителни функции:
     - BOOL IsAppRun () - Тази функция се използва за откриване на стартирано приложение за което е създаден модула. Няма никакво значение по какъв начин ще се открие стартираното приложение, важното е тази функция да враща резултат "TRUE" ако е открито приложението и "FALSE" в останалите случай. Тази функция се извиква от Media Max постоянно, през интервал от 1 секунда. Това е направено с цел веднага да се открие ако има стартирано ново приложение за което има модул и ако се открие такова веднага да се зареди неговия модул и то да може да се управлява.
   Препоръчваме модула да връща "TRUE" само в случай, че приложението за което е направен е на фокус. Ако модула е направен така че да връща резултат "TRUE", винаги независимо дали неговото приложение е на фокус или не, ако има зареден още един такъв модул то двата модула няма да могат да работят заедно. Това е така защото Media Max при обхождането на модулите ще работи само с последния модул който е върнал резултат "TRUE", независимо, че преди него същият резултат са върнали и други модули.
   Ако модула който създавате е "системен" тогава тази функция не се използва и тя трябва да връща винаги "FALSE".

   - char* ScreenTextProc (UINT message) - Тази функция се извиква от Media Max когато е получена команда от пулта за дистанционно управление, преди да се обработи командата - т.е. преди да се предаде към функцията за обработка на команди на съответния модул. Когато се извика тази функция като параметър и се предава кода на получената команда. Тази функция решава дали тази команда трябва да се изведе на екрана на монитора (с големите зелени букви) или не. Ако трябва да се изведе, то тя трябва да върне като резултат указател към текста (string), който ще трябва да се покаже на екрана при съответната команда.


   - BOOL MessageProc (UINT message) - Тази функция е най-важната в един модул. В нея се преобразуват командите от Media Max, след като са били обработени и филтрирани, в команди към съответната програма. Няма никакво значение как ще бъдат изпълнени тези команди. Всичко зависи от модула и от програмата която ще се контролира. Командата може да се предаде на съответната програма като съобщение (WM_COMMAND), като съобщение за натиснат клавиш (WM_KEYDOWN, WM_KEYUP), като команда от мишката и т.н. Точно какво ще се предаде на програмата която ще се контролира зависи само от нея и от човека които пише модула. Ако едно една команда е обработена от модула, то тази функция като резултат трябва да върне "TRUE", във всички останали случай връща "FALSE".


   - plugindata* GetPlugInData () - Тази функция се извиква от Media Max за да получи указател към структурата "pugindata" на модула. След което може да запише данните в нея.

   - void SetPlugInData (plugindata* data) - Тази функция записва данни в структурата "pugindata" на модула.

    - DWORD InitProc () - Тази функция се извиква от Media Max веднага след като е зареден модула за да може той да си инициализира данните.

   - DWORD QuitProc () - Тази функция се извиква от Media Max преди да се освободи модула.

 - DWORD ConfigProc () - Тази функция се извиква от Media Max при натискане на бутона "Конфигуриране на модул" от диалога за конфигуриране на Media Max.

   Във всеки модул е задължително да се включи и файла "definition.h". В него се съдържат командите изпращани от Media Max към модула.




//съдържание на файла "definition.h"
#define IR_PLAY WM_USER + 300 //PLAY бутон #define IR_STOP WM_USER + 301 //STOP бутон #define IR_VOLUP WM_USER + 302 //VOL+ бутон #define IR_VOLDOWN WM_USER + 303 //VOL- бутон #define IR_DSC WM_USER + 304 //MUTE бутон #define IR_REWIND WM_USER + 305 //REWIND бутон #define IR_FFWD WM_USER + 306 //FFWD бутон #define IR_PAUSE WM_USER + 307 //PAUSE бутон #define IR_PREV WM_USER + 308 //PREV бутон #define IR_SIDE WM_USER + 309 #define IR_NEXT WM_USER + 310 //NEXT бутон #define IR_DISC WM_USER + 311 //ZOOM/JMP бутон #define IR_SLEEP WM_USER + 312 //SLEEP бутон #define IR_NEWS WM_USER + 313 //MIN/MAX бутон #define IR_TAPE1 WM_USER + 314 #define IR_TAPE2 WM_USER + 315 #define IR_STANDBY WM_USER + 316 //STANDBY бутон #define IR_MODE WM_USER + 317 //MODE бутон #define IR_TUNER WM_USER + 318 #define IR_COMMON1 WM_USER + 319 //1 бутон #define IR_COMMON2 WM_USER + 320 //2 бутон #define IR_COMMON3 WM_USER + 321 //3 бутон #define IR_COMMON4 WM_USER + 322 //4 бутон #define IR_COMMON5 WM_USER + 323 //5 бутон #define IR_COMMON6 WM_USER + 324 //6 бутон #define IR_COMMON7 WM_USER + 325 //7 бутон #define IR_COMMON8 WM_USER + 326 //8 бутон #define IR_COMMON9 WM_USER + 327 //9 бутон #define IR_COMMON10 WM_USER + 328 //0 бутон #define IR_COMMON11 WM_USER + 329 //-/-- бутон #define IR_COMMON12 WM_USER + 330 #define IR_COMMON13 WM_USER + 331 #define IR_COMMON14 WM_USER + 332 #define IR_COMMON15 WM_USER + 333
 

   При инсталиране на Media Max, инсталиращата програма записва пътя до Media Max.exe в "HKEY_CURRENT_USER\Software\AlphaIntellect\MediaMax".

    Настройките на всеки модул можете да записвате във файла "plugin.ini".

    Media Max зарежда тези модули, които се намират в директорията "Plugin"


  Примера който е показан по-долу е за програмата "CD Player", която се инсталира заедно с Windows 98. Не го приемайте като еталон за създаване на модули. Примера е направен с цел да се покажат колкото се може повече варианта за управление на програми с Media Max.



#include "definition.h"

//освен файла "definition.h" всички други файлове
//не са задължителни за модула, тяхното включване
//зависи само от това какво ще се прави с
//този модул
#include "movie_plugin_1.h"
#include "resource.h"
#include "windows.h"
#include "commdlg.h"
#include "shellapi.h"
#include "mmsystem.h"

//максималната дължина на стринговете
#define MAX_STR_LEN   1024
//името на секцията в INI файла където ще се
//записват данните за модула
#define INI_SECTION "CD Player"
//с този ключ се записва пътя към файла
#define INI_KEY "apppath"
//стойност по подразбиране
#define INI_DEF "No data!"

//стрингове които се показват в диалога за
//настройки на модула
#define STR_LOAD "Ако желаете при натискане на бутона
STANDBY да стартирате RealMagic DVD въведете пътя до
   файла \"Station.exe\"."
//текст на бутона за отваряне на "Open dialog"
#define STR_BROWSE_BTN "Намери"
//текст на "OK" бутона
#define STR_OK_BTN "Да"
//текста на "CANCEL" бутона
#define STR_CANCEL_BTN "Откажи"
//описание на модула
#define STR_PRGDATA "Данни за модула :"
//име на файла на контролираната програма
#define STR_EXEFILE "Файл на управляваното приложение:
   Sation.exe"
//версия на управляваното приложение
#define STR_APPVER "Версия на управляваното приложение : 1.0"
//версия на модула
#define STR_PLGVER "Версия на модула за управление на
   CD Player : 1.0"
//име на собственика
#define STR_MAKER "Алфа Интелект. Всички права запазени!"
//WEB страница
#define STR_WEB "www.mediamax2.com"
//e-mail адрес
#define STR_MAIL "alpha@acvilon.com"

//с тази структура се предават данни за модула към Media Max
//някои от полетата не са задължителни
struct plugindata
{
   // HWND на прозореца на Media Max
   HWND      mmhWnd;
   // HWND на контролираната програма
   HWND      apphWnd;
   // HINSTANCE на DLL файла
   HINSTANCE dllhIns;
   // име на файла на управляваната програма
   char      appfileName   [MAX_STR_LEN];
   // име на модула
   char      pluginName    [MAX_STR_LEN];
   // име на програмата която се контролира
   char      appName       [MAX_STR_LEN];
   // версия на модула
   char      pluginversion [MAX_STR_LEN];
   // описание на модула
   char      description   [MAX_STR_LEN];
   // името с което ще се записва модула във INI файла
   char keyname       [MAX_STR_LEN];
   // типа на модула
   // ако има стойност 1 - системен модул
   // ако има стойност 2 - модул за управляване на програми
   DWORD     plugintype;
};

//променливи за шрифтовете
LOGFONT            lf;
HFONT              hf;

//променливи за записване във INI файла
OPENFILENAME       Ofn;
char               strFile       [MAX_STR_LEN];
char               szFile        [MAX_STR_LEN];
char               pluginPath    [MAX_STR_LEN];
char*              ppos;

//променлива от структурата за предаване на данни
//между Media Max и модула
plugindata            myData;

//HWND към прозореца на бутон
//използва се само в тоси модул
HWND               buttonHwnd;

//HWND към прозореца на управляваната програма
HWND               mainHwnd;
char               screentext [MAX_STR_LEN];

//тези променливи се използват за да може да се забави
 //предаването на команди от пулта за дистанционно
//управление към програмата която се управлява
__int64            dTime;
__int64            cTime;
__int64            bTime;
//периода през които е забранено да се предават команди
__int64            period;

//тези променливи се използват за да може да управлява
//силата на звука на CD Playera, понеже той няма възможност
//за това и се използва "Master Volume Control" на Windows
UINT               nNumMixers;
HMIXER             hMixer;
MIXERCAPS          mxcaps;
DWORD              soundMinimum;
DWORD              soundMaximum;
DWORD              volumeControlID;
BOOL               audio_flag;
DWORD              volume_value;
DWORD              volume_step;

//функцията за обработка на съобщенията от диалога
//за настройки на модула
LRESULT CALLBACK PropertiesDlg (HWND, UINT, WPARAM, LPARAM);

//деклариране на експортните функции на DLL файла
extern "C" __declspec (dllexport)
         plugindata* GetPlugInData();

extern "C" __declspec (dllexport)
         void  SetPlugInData(plugindata* data);

extern "C" __declspec (dllexport)
         BOOL  MessageProc(UINT message);

extern "C" __declspec (dllexport)
         char* ScreenTextProc(UINT message);

extern "C" __declspec (dllexport) BOOL  IsAppRun();

extern "C" __declspec (dllexport) DWORD InitProc();

extern "C" __declspec (dllexport) DWORD QuitProc();

extern "C" __declspec (dllexport) DWORD ConfigProc();

//входната функция на DLL файла
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                )
{
    switch (ul_reason_for_call)
   {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
    }
    return TRUE;
}

//следващите няколко функции са за управление на звука
//******************************************************
//инициализира звуковите устройства
BOOL soundInitialize()
{
   nNumMixers = mixerGetNumDevs();

   hMixer = NULL;
   ZeroMemory(&mxcaps, sizeof(MIXERCAPS));

   soundMinimum = 0;
   soundMaximum = 0;
   volumeControlID = 0;

   if (nNumMixers != 0)
   {
      if (mixerOpen(&hMixer,
                  0,
                  NULL,
                  NULL,
                  MIXER_OBJECTF_MIXER )
         != MMSYSERR_NOERROR)
      {
         return FALSE;
      }

      if (mixerGetDevCaps(reinterpret_cast(hMixer),
                       &mxcaps, sizeof(MIXERCAPS))
         != MMSYSERR_NOERROR)
      {
         return FALSE;
      }
   }

   return TRUE;
}

//затваря отворените звукови устройства
BOOL soundUninitialize()
{
   BOOL bSucc = TRUE;

   if (hMixer != NULL)
   {
      bSucc = (mixerClose(hMixer) == MMSYSERR_NOERROR);
      hMixer = NULL;
   }

   return bSucc;
}

//намира главното устройство за контрол на звука
BOOL soundGetMasterVolumeControl()
{
   if (hMixer == NULL)
   {
      return FALSE;
   }

   MIXERLINE mxl;
   mxl.cbStruct = sizeof(MIXERLINE);
   mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
   if (mixerGetLineInfo(reinterpret_cast(hMixer),
                     &mxl,
                     MIXER_OBJECTF_HMIXER |
                     MIXER_GETLINEINFOF_COMPONENTTYPE)
      != MMSYSERR_NOERROR)
   {
      return FALSE;
   }

   MIXERCONTROL mxc;
   MIXERLINECONTROLS mxlc;
   mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
   mxlc.dwLineID = mxl.dwLineID;
   mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
   mxlc.cControls = 1;
   mxlc.cbmxctrl = sizeof(MIXERCONTROL);
   mxlc.pamxctrl = &mxc;
   if (mixerGetLineControls(reinterpret_cast(hMixer),
                        &mxlc,
                        MIXER_OBJECTF_HMIXER |
                        MIXER_GETLINECONTROLSF_ONEBYTYPE)
      != MMSYSERR_NOERROR)
   {
      return FALSE;
   }

   soundMinimum = mxc.Bounds.dwMinimum;
   soundMaximum = mxc.Bounds.dwMaximum;
   volume_step = mxc.Bounds.dwMaximum / 20;
   volumeControlID = mxc.dwControlID;

   return TRUE;
}

// получава стойността на силата на звука
BOOL soundGetMasterVolumeValue(DWORD &dwVal)
{
   if (hMixer == NULL)
   {
      return FALSE;
   }

   MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
   MIXERCONTROLDETAILS mxcd;
   mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
   mxcd.dwControlID = volumeControlID;
   mxcd.cChannels = 1;
   mxcd.cMultipleItems = 0;
   mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
   mxcd.paDetails = &mxcdVolume;
   if (mixerGetControlDetails(reinterpret_cast(hMixer),
                         &mxcd,
                         MIXER_OBJECTF_HMIXER |
                         MIXER_GETCONTROLDETAILSF_VALUE)
      != MMSYSERR_NOERROR)
   {
      return FALSE;
   }

   dwVal = mxcdVolume.dwValue;

   return TRUE;
}

// задава нова стойност на силата на звука
BOOL soundSetMasterVolumeValue(DWORD dwVal)
{
   if (hMixer == NULL)
   {
      return FALSE;
   }

   MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
   MIXERCONTROLDETAILS mxcd;
   mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
   mxcd.dwControlID = volumeControlID;
   mxcd.cChannels = 1;
   mxcd.cMultipleItems = 0;
   mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
   mxcd.paDetails = &mxcdVolume;
   if (mixerSetControlDetails(reinterpret_cast(hMixer),
                         &mxcd,
                         MIXER_OBJECTF_HMIXER |
                         MIXER_SETCONTROLDETAILSF_VALUE)
      != MMSYSERR_NOERROR)
   {
      return FALSE;
   }

   return TRUE;
}
//***********************************************
//край на функциите за контрол на звука

//от тука започва основната част от кода на модула
//************************************************
//тази функция се извиква през 1 секунда от Media Max
//и чрез нея се определя дали е активан програмата
//за която е саздаден този модул
BOOL IsAppRun ()
{
   mainHwnd = FindWindow ("SJE_CdPlayerClass",NULL);
   myData.apphWnd = mainHwnd;
   if (mainHwnd != 0)
   {
      if (mainHwnd == GetForegroundWindow()) return TRUE;
   }
   return FALSE;
}

// тази функция се извиква от Media Max за да се изведе
//командата на монитора при натискане на бутон от пулта
//за дистанционно управление
char* ScreenTextProc (UINT message)
{
   strcpy (screentext,"");
   switch (message)
   {
      case IR_VOLUP:
         strcpy (screentext, "VOL +");
         break;
      case IR_VOLDOWN:
         strcpy (screentext, "VOL -");
         break;
      case IR_PLAY:
         strcpy (screentext, "PLAY");
         break;
      case IR_STOP:
         strcpy (screentext, "STOP");
         break;
      case IR_PREV:
         strcpy (screentext, "PREV");
         break;
      case IR_NEXT:
         strcpy (screentext, "NEXT");
         break;
      case IR_PAUSE:
         strcpy (screentext, "PAUSE");
         break;
      case IR_REWIND:
         strcpy (screentext, "REWIND");
         break;
      case IR_FFWD:
         strcpy (screentext, "FFWD");
         break;
      case IR_DISC:
         strcpy (screentext, "FULL SCR");
         break;
      case IR_SLEEP:
         strcpy (screentext, "SLEEP");
         break;
      case IR_NEWS:
         strcpy (screentext, "MIN/MAX");
         break;
      case IR_DSC:
         strcpy (screentext, "MUTE");
         break;
      case IR_COMMON1:
         strcpy (screentext, "1");
         break;
      case IR_COMMON2:
         strcpy (screentext, "2");
         break;
      case IR_CPMMON3:
         strcpy (screentext, "3");
         break;
      case IR_COMMON4:
         strcpy (screentext, "4");
         break;
      case IR_COMMON5:
         strcpy (screentext, "5");
         break;
      case IR_COMMON6:
         strcpy (screentext, "6");
         break;
      case IR_COMMON7:
         strcpy (screentext, "7");
         break;
      case IR_COMMON8:
         strcpy (screentext, "8");
         break;
      case IR_COMMON9:
         strcpy (screentext, "9");
         break;
      case IR_COMMON10:
         strcpy (screentext, "0");
         break;
      case IR_COMMON11:
         strcpy (screentext, "-/--");
         break;
      case IR_STANDBY:
         //strcpy (screentext, "");
         break;
   }
   return screentext;
}

//в тази функция се изпълняват необходимите действия
//за да може всяко натискане на бутона от пулта за
//дистанционно управление да се преобразува в команда
//към съответната програма
BOOL  MessageProc (UINT message)
{
   //ако няма валиден HWND към прозореца на контролираната
   //програма се излиза от функцията
   //прави се само изключение за командата "IR_STANDBY"
   //понеже при стартиране на самата програма от
   //бутона "STANDBY"
   //още няма валиден HWND
   if ((mainHwnd == NULL) && (message != IR_STANDBY))
        return FALSE;
   switch (message)
   {
      //увеличаване на звука
      case IR_VOLUP:
         //взема се стойността на таймера
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         //ако новата команда е пристигнала преди да е изтекъл
         //периода, тя не се обработва
         if ((cTime - bTime) > period)
         {
            if (audio_flag)
            {
               soundGetMasterVolumeValue(volume_value);

               if ((volume_value + volume_step) < soundMaximum)
                  volume_value += volume_step;

               soundSetMasterVolumeValue (volume_value);
            }
            //взема новата стойност на таймера
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);

            //запазва я в "bTime"
            bTime = cTime;
         }
      break;
      //намаляване на звука
      case IR_VOLDOWN:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period)
         {
            if (audio_flag)
            {
               if ((volume_value - volume_step) > soundMinimum)
                  volume_value -= volume_step;

               soundSetMasterVolumeValue (volume_value);
            }

            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      // команда PLAY
      case IR_PLAY:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                          (WPARAM) 0x000003e8,
                          (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда STOP
      case IR_STOP:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                          (WPARAM) 0x000003e9,
                          (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда PREV
      case IR_PREV:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                          (WPARAM) 0x000003eb,
                          (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда NEXT
      case IR_NEXT:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                          (WPARAM) 0x000003ee,
                          (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда PAUSE
      case IR_PAUSE:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                          (WPARAM) 0x000003e9,
                          (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда REWIND
      case IR_REWIND:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period)
         {
            buttonHwnd = GetDlgItem (mainHwnd, 1004);

            SendMessage (buttonHwnd, WM_LBUTTONDOWN,
                           (WPARAM) 0x00000001,
                           (LPARAM) 0x000a0008);
            SendMessage (buttonHwnd, WM_LBUTTONUP,
                           (WPARAM) 0x00000000,
                           (LPARAM) 0x000a0008);
            bTime = cTime;
         }
      break;
      //команда FFWD
      case IR_FFWD:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period)
         {
            buttonHwnd = GetDlgItem (mainHwnd, 1005);

            SendMessage (buttonHwnd, WM_LBUTTONDOWN,
                           (WPARAM) 0x00000001,
                           (LPARAM) 0x000a0008);
            SendMessage (buttonHwnd, WM_LBUTTONUP,
                           (WPARAM) 0x00000000,
                           (LPARAM) 0x000a0008);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда STOP
      case IR_DISC:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                           (WPARAM) 0x000003ea,
                           (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
         return FALSE;
         
      break;

      //команда SLEEP
      //тази функция връща FLASE понеже се обработва
      //от Media Max
      case IR_SLEEP:
         return FALSE;

      break;
      //команда за MAXIMIZE или MINIMIZE на прозореца
      //на управляваната програма
      case IR_NEWS:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            if (mainHwnd != 0)
               if (IsIconic(mainHwnd))
               {
                  ShowWindow (mainHwnd, SW_SHOWNORMAL);
               }
               else
               {
                  ShowWindow (mainHwnd, SW_MINIMIZE);
               }

            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда ZOOM/JMP - в този модул се използва
      //за отваряне на вратичката на CD-ROM устройството
      case IR_DSC:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            SendMessage (mainHwnd, WM_COMMAND,
                            (WPARAM) 0x000003ef,
                            (LPARAM) 0x00000000);
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
      //команда STANDBY, тази команда се предава към модула само ако в
      //настройките на Media Max e избрано "Дефинирано в модула"
      case IR_STANDBY:
         QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
         if ((cTime - bTime) > period*8)
         {
            //ако програната е стартиране се спира
            //с кмбинация "Alt+F4"
            mainHwnd = FindWindow ("SJE_CdPlayerClass",NULL);
            if (mainHwnd != NULL)
            {
               keybd_event( VK_MENU ,0 ,0 ,0 );
               keybd_event( VK_F4 ,0 ,0 ,0 );
               keybd_event( VK_F4 ,0 ,KEYEVENTF_KEYUP,0 );
               keybd_event( VK_MENU ,0 ,KEYEVENTF_KEYUP ,0 );
            }
            else
            {
               //ако програмата не е стартирана,
               //но е записан патя до нея
               //в INI файла се стартира от там
               if (MAX_STR_LEN > GetModuleFileName (NULL,
                            pluginPath, MAX_STR_LEN))
               {
                  ppos = strrchr (pluginPath,92);
                  *ppos = 0;
                  strcat (pluginPath, "\\plugin\\plugin.ini");
                  if (0 != GetPrivateProfileString (INI_SECTION,
                             INI_KEY,
                             INI_DEF,
                             szFile,
                             MAX_STR_LEN,
                             pluginPath))
                  {
                      ShellExecute (myData.mmhWnd,
                                      NULL,
                                      szFile,
                                      NULL,
                      NULL,SW_SHOWNORMAL  );
                  }
               }
            }
            QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
            bTime = cTime;
         }
      break;
   }

   return TRUE;
}

//предава на Media Max структурата с данните на модула
plugindata*  GetPlugInData ()
{
   return &myData;
}

//с тази функция Media Max допълва данните
//към структурата на модула
void SetPlugInData (plugindata* data)
{
   memcpy (&myData, data, sizeof(plugindata));
}

// функция за инициализация на модула
//извиква се от Media Max при зареждане на модула
DWORD InitProc  ()
{
   double d_buffer;

   //името на EXE файла на контролираната програма
   strcpy (myData.appfileName, "cdplayer.exe");
   //името на този модул
   strcpy (myData.pluginName, "CD Player1.0");
   //името на програмата
   strcpy (myData.appName, "CD Player");
   //версия на модула
   strcpy (myData.pluginversion, "v1.0");
   //описание на модула
   strcpy (myData.description,
   "Media Max plugin module (CD Player) - v1.2 2001 ");
   //тип на модула
   myData.plugintype = 2;

   //зарежда се честотата на таймера на данната платка
   QueryPerformanceFrequency((LARGE_INTEGER *)&dTime);

   //изчислява се периода на забрана за предаване на команди
   //неговата стойност не е критична
   //наглася се такава стойност, с която да не се
   //предават командите прекалено бързо
   d_buffer = 1000000/(double)dTime;
   d_buffer  = 41000 / d_buffer;
   period = (__int64)d_buffer;


   audio_flag = FALSE;
   //инициализира звуковите устройства
   if (soundInitialize())
   {
      audio_flag = TRUE;
      soundGetMasterVolumeControl();
      soundGetMasterVolumeValue(volume_value);
   }


   return 0;
}

//тази функция се извиква преди да се унищожи
//модула от Media Max
DWORD QuitProc  ()
{
   soundUninitialize();
   return 0;
}

//тази функция се извиква когато ще се конфигурира модула
DWORD ConfigProc  ()
{
   DialogBox (myData.dllhIns,
                    (LPCTSTR)IDD_DIALOG1,
                    myData.mmhWnd,
                   (DLGPROC) PropertiesDlg);
   return 0;
}

//зарежда стринговете на диалога за настройки
//зарежда и шрифтовете на контролите
DWORD LoadStringData (HWND hDlg, char* strdata, UINT itemnum)
{
   HWND         itemhWnd;

   if (hf == NULL) return 0;

   itemhWnd = GetDlgItem (hDlg, itemnum);
   SendMessage (itemhWnd,
                WM_SETFONT,
                (WPARAM) hf,
                (LPARAM) TRUE);
   SetDlgItemText (hDlg, itemnum, strdata);
   return 0;
}

//функцията за обработка на съобщенията от диалога
// за настройки
LRESULT CALLBACK PropertiesDlg (HWND hDlg,
                             UINT message,
                            WPARAM wParam,
                            LPARAM lParam)
{

   switch (message)
   {
      case WM_INITDIALOG:

         memset(&lf, 0, sizeof(LOGFONT));
         lf.lfHeight = -10;
         lf.lfWeight = FW_NORMAL;
         lf.lfCharSet = RUSSIAN_CHARSET;

         strcpy((LPSTR)&(lf.lfFaceName), "MS Sans Serif");

         hf = CreateFontIndirect(&lf);


         if (MAX_STR_LEN > GetModuleFileName (NULL,
                       pluginPath,
                       MAX_STR_LEN))
         {
            ppos = strrchr (pluginPath,92);
            *ppos = 0;
            strcat (pluginPath, "\\plugin\\plugin.ini");
            if (0 != GetPrivateProfileString (INI_SECTION,
                                           INI_KEY,
                                           INI_DEF,
                                           szFile,
                                           MAX_STR_LEN,
                                          pluginPath))
            {
               SetDlgItemText (hDlg, IDC_EDIT1, szFile);
            }
         }

         LoadStringData (hDlg, STR_LOAD, IDC_LOAD);
         LoadStringData (hDlg, STR_BROWSE_BTN, IDC_BUTTON1);
         LoadStringData (hDlg, STR_OK_BTN, IDOK);
         LoadStringData (hDlg, STR_CANCEL_BTN, IDCANCEL);
         LoadStringData (hDlg, STR_PRGDATA, IDC_PRGDATA);
         LoadStringData (hDlg, STR_EXEFILE, IDC_EXEFILE);
         LoadStringData (hDlg, STR_APPVER, IDC_APPVER);
         LoadStringData (hDlg, STR_PLGVER, IDC_PLGVER);
         LoadStringData (hDlg, STR_MAKER, IDC_MAKER);
         LoadStringData (hDlg, STR_WEB, IDC_WEB);
         LoadStringData (hDlg, STR_MAIL, IDC_MAIL);
         break;

      case WM_COMMAND:
         switch (LOWORD(wParam))
         {
            case IDC_BUTTON1:
               szFile[0] = '\0';
               Ofn.lStructSize = sizeof(OPENFILENAME);
               Ofn.hwndOwner = NULL;//hWnd;
               Ofn.lpstrFilter = "Application\0*.exe\0\0";
               Ofn.lpstrCustomFilter = (LPSTR)NULL;
               Ofn.nMaxCustFilter = 0L;
               Ofn.nFilterIndex = 1L;
               Ofn.lpstrFile = szFile;
               Ofn.nMaxFile = sizeof(strFile);
               Ofn.lpstrFileTitle = strFile;
               Ofn.nMaxFileTitle = sizeof("Open");
               Ofn.lpstrInitialDir = (LPSTR) NULL;
               Ofn.lpstrTitle = (LPSTR)NULL;
               Ofn.Flags = OFN_SHOWHELP |
                      OFN_PATHMUSTEXIST |
                       OFN_FILEMUSTEXIST;
               Ofn.nFileOffset = 0;
               Ofn.nFileExtension = 0;
               Ofn.lpstrDefExt = "exe";
               Ofn.lpstrInitialDir = "c:\\Program Files" ;

               if (0 != GetOpenFileName(&Ofn))
               {
                  SetDlgItemText (hDlg, IDC_EDIT1, szFile);
               }
            break;
            case IDOK:
               //записва новите настройки на модула в INI файла
               if (0 == GetDlgItemText (hDlg,
                                IDC_EDIT1,
                                szFile,
                                 MAX_STR_LEN)) return FALSE;
               if (MAX_STR_LEN > GetModuleFileName (NULL,
                                 pluginPath,
                                 MAX_STR_LEN))
               {
                  ppos = strrchr (pluginPath,92);
                  *ppos = 0;
                  strcat (pluginPath, "\\plugin\\plugin.ini");
                  WritePrivateProfileString (INI_SECTION,
                                 INI_KEY,
                                 szFile,
                                 pluginPath);
               }

               if (hf != NULL) DeleteObject (hf);

               EndDialog(hDlg, LOWORD(wParam));

               break;
            case IDCANCEL:

               if (hf != NULL) DeleteObject (hf);

               EndDialog(hDlg, LOWORD(wParam));

            break;
         }
         break;
   }
    return FALSE;
}
 




  Това са основните моменти при създаването на модули за Media Max. Ако имате въпроси не се притеснявайте да се обърнете към нашият екип за да Ви помогнем да ги решите. Пишете на нашият e-mail: alpha@acvilon.com




   Начало | Новини | Помощ | Модули | Media Max |  Media Max Demo | Поръчай Media Max | Въпроси | Изтегли | Контакти   

2000-2003 Алфа Интелект Всички права запазени.