Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ответ на SendMessage


Автор: cmlwt 27.6.2008, 21:26
Тут  такая проблема хочу  управлять WinAmp'ом  через  программу По средствам  SendMessage (ну или PostMessage) Вот   набор комманд я нашел  Некоторые команды позваляют возвращать данные (список песен в плей листе Какая сейчас громкость Сколько  уже прошло времени от песни) Кто  нить  подскажет как получить комманду Желательно в примере Ото   Ни разу не пробовал получать  ответ  на посланный  мною запрос.


Автор: cmlwt 28.6.2008, 01:34
Из всего что я нашел я смог сделать токо:

Код

void WinAmp()
{
HWND hCommWin;
MSG m_msgCur;
if (hCommWin = ::FindWindow("Winamp v1.x", NULL)) MessageBox( "Нашли окно",0,0);
else MessageBox( "нифига",0,0);
//::PostMessage(hCommWin, WM_USER,10,122);
::PostMessage(hCommWin, WM_USER,0,104);
while (true)
{
::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE);

if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) break;
::TranslateMessage(&m_msgCur); 

}

}


И что мне с этим m_msgCur делать?

Пробовал

Код

 BYTE keyStateArr[256];
  WORD word;
  UINT scanCode = m_msgCur.lParam;
        char *ch = new char [10];

  //Translate virtual key code to ascii
  GetKeyboardState(keyStateArr);
  ToAsciiEx(m_msgCur.wParam, scanCode, keyStateArr, &word, 0,(HKL)m_msgCur.lParam);
  *ch = (char) word;
  
  if ((GetKeyState(VK_SHIFT) & 0x8000) && m_msgCur.wParam >= 'a' && m_msgCur.wParam <= 'z')
  ch += 'A'-'a';


Но ничего не дало

Автор: Lazin 28.6.2008, 12:12
читай MSDN
функция SendMessage вызывает оконную процедуру, которая должна вернуть значение, это значение потом и возвращает ф-я SendMessage...

Цитата(cmlwt @  27.6.2008,  21:26 Найти цитируемый пост)
Тут  такая проблема хочу  управлять WinAmp'ом  через  программу По средствам  SendMessage (ну или PostMessage) Вот   набор комманд я нашел  Некоторые команды позваляют возвращать данные (список песен в плей листе Какая сейчас громкость Сколько  уже прошло времени от песни) Кто  нить  подскажет как получить комманду Желательно в примере Ото   Ни разу не пробовал получать  ответ  на посланный  мною запрос.

у винампа есть свой API и SDK...

Автор: cmlwt 28.6.2008, 13:36
Цитата(Lazin @ 28.6.2008,  12:12)
читай MSDN
функция SendMessage вызывает оконную процедуру, которая должна вернуть значение, это значение потом и возвращает ф-я SendMessage...

Это я уже понял   Но как  полученное  сообщение перевести  в какой нить  char или CString?

Цитата

у винампа есть свой API и SDK...


А  это тут причем ?

Автор: ama_kid 28.6.2008, 13:44
Цитата(cmlwt @  28.6.2008,  13:36 Найти цитируемый пост)
Но как  полученное  сообщение перевести  в какой нить  char или CString?
Возвращаемое функцией SendMessage значение - целое число, если ты знаешь, что ответом должна быть строка - значит интерпретируй результат как указатель на буфер с этой строкой. В общем, обычная работа с типами.
Цитата(cmlwt @  28.6.2008,  13:36 Найти цитируемый пост)
А  это тут причем ?
А при том, что возможно будет намного легче (и самое главное - правильнее) использовать функции, которые дает сам винамп  smile

Автор: Lazin 28.6.2008, 14:02
Цитата(ama_kid @  28.6.2008,  13:44 Найти цитируемый пост)
если ты знаешь, что ответом должна быть строка - значит интерпретируй результат как указатель на буфер с этой строкой. В общем, обычная работа с типами

как указатель нельзя, по крайней мере из другого приложения...

Автор: cmlwt 28.6.2008, 14:33
Цитата(ama_kid @ 28.6.2008,  13:44)
Возвращаемое функцией SendMessage значение - целое число, если ты знаешь, что ответом должна быть строка - значит интерпретируй результат как указатель на буфер с этой строкой. В общем, обычная работа с типами.


Во  спасибо догнал  Вроде как ото  ввело в заблуждение вот  эта строчка

Код

124 Возвращает длину текущего плэйлиста в трэках.


Не внимательно прочитал  и подумал позвращает  список   песен  в плэй листе   smile 

Тоесть  получается так 

Код

::PostMessage(hCommWin, WM_USER,0,124);
while (true)
{
::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE);

if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) break;
::TranslateMessage(&m_msgCur); 

}

}



То  поидеи после Транслэйт Мессаже у меня в m_msgCur  будет лежать какое то  число   Правильно?


Цитата

А при том, что возможно будет намного легче (и самое главное - правильнее) использовать функции, которые дает сам винамп  


Ну я думаю  это лишнее чтобы  Копать  его  API Если  мне всего лишь нужно  отослать  сообщение  WinAmp'у  И получить  какое то число которое он вернет.


Автор: ama_kid 28.6.2008, 19:03
Цитата(cmlwt @  28.6.2008,  14:33 Найти цитируемый пост)
Тоесть  получается так 
ничего не получается. Зачем ты вообще трогаешь цикл обработки сообщений приложения? Там где тебе надо получить количество песен - просто делай
Код
int Num = ::SendMessage(hCommWin, WM_USER,0,104);
После этого Num должен содержать число треков (при условии, что винамп запущен, конечно, и имеет корректную обработку данного сообщения). Можешь посмотреть функцию http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx для дополнительных возможностей... 
Цитата(cmlwt @  28.6.2008,  14:33 Найти цитируемый пост)
Ну я думаю  это лишнее чтобы  Копать  его  API Если  мне всего лишь нужно  отослать  сообщение  WinAmp'у  И получить  какое то число которое он вернет.
Может это и лишнее, но это правильно smile К тому же, вполне возможно там функционал богаче и возможностей больше (я сам не юзал, поэтому говорю в предполагательном тоне)..

Цитата(Lazin @  28.6.2008,  14:02 Найти цитируемый пост)
как указатель нельзя, по крайней мере из другого приложения... 
Да, здесь согласен... smile

Автор: cmlwt 28.6.2008, 20:22
Цитата(ama_kid @  28.6.2008,  19:03 Найти цитируемый пост)
После этого Num должен содержать число треков (при условии, что винамп запущен, конечно, и имеет корректную обработку данного сообщения).



Спасиб   Разобрался  

Код

     Num = ::SendMessage(hCommWin, WM_USER,0,124);


Работает ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)