Pauzowanie muzyki gdy ktoś mówi coś na ts'ie

tobix10

Użytkownik
Dołączył
Luty 25, 2009
Posty
65
Chcę napisać taki program, który w momencie kiedy ktoś powie coś na teamspeaku to z pauzuje on muzykę w foobarze.
Do foobara znalazłem sobie fajną wtyczkę do której komendy przesyła się przez linię poleceń, więc nie będę musiał pisać sam.

Podglądałem wiadomości przychodzące do głównego okna (class name TMainForm, nazwa okna TeamSpeak 2).
Gdy ja lub ktoś coś powiedzą to generowana jest wiadomość WM_USER + 893 (0x0000077d).

Założyłem hook na WH_CALLWNDPROC, który wg msdn może być globalny lub nie.
Kod:
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

ofstream out;                                             //w celach informacyjnych
#define MSG_ID (WM_USER + 893)
HWND wnd = 0;
HHOOK hook = 0;

LRESULT CALLBACK MsgHack(int code, WPARAM wParam, LPARAM lParam);

int main(int argc, char **argv)
{
    out.open("./plik.txt", ios::out | ios::app);
    wnd = FindWindow("TMainForm", "TeamSpeak 2");
    if(wnd != 0)
    {
        out << "Find window   " << wnd;
        hook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)MsgHack, GetModuleHandle(""), 0);
        out << "\nSet hook";
    }
    else 
    {
        out << "Not find window";
        return -1;
    }

    cout << "Wcisnij ESC aby zakonczyc\n";
    while(1)
    {
        if(GetAsyncKeyState(VK_ESCAPE))
            break;
        Sleep(10);
    }
    
    UnhookWindowsHookEx(hook);
    out << "\nunhook";

    return 0;
}
LRESULT CALLBACK MsgHack(int code, WPARAM wParam, LPARAM lParam)
{
    if(code < 0) return CallNextHookEx(0, code, wParam, lParam);
    
    CWPSTRUCT *cwp = 0;
    if(wnd != 0)
    {
        cwp = (CWPSTRUCT *)lParam;
        out << "\ncwp = reinterpret_cast<CWPSTRUCT *>(lParam)\t" << lParam;
        out << "\n cwp->hwnd: " << cwp->hwnd 
            << "\ncwp->message: " << cwp->message;
        if(cwp->hwnd == wnd)
        {
            out << "\nhwnd = wnd";
            if(cwp->message == MSG_ID)
            {
                WinExec("\"D:\\Program Files\\foobar2000\\foobar.exe\" /runcmd=\"Playback/Play or Pause\"", SW_MINIMIZE);
                out << "\nWinExec";
            }
        }
    }

    out << "\nNextHook";
    return CallNextHookEx(0, code, wParam, lParam);
}

Po uruchomieniu znajduje okno TS, ale przez MsgHack nie przechodzi okno o takim samym identyfikatorze ;/.
WinExec też nie działa poprawnie. Testowałem jego wywołanie i nie z pauzował muzyki, to samo ShellExecute, ale w tej sprawie muszę jeszcze sprawdzić CreateProcess.

Co może być nie tak ?
 
Do góry Bottom