Witam. Skleciłem program do wysyłania określonego klawisza, do określonej aplikacji. Kod przedstawiam poniżej.
Natknąłem się na dwa problemy:

  1. Po pobraniu uchwytu okna, pobieram nazwę okna. Problem jest w tym, że mogę ją pobrać tylko raz, po zmianie piosenki nazwa okna zmienia się, i za chiny nie mogę jej znów pobrać. Co może być tego przyczyna, w końcu pobieram nazwę głównego okna?

  2. Podobnie jak u góry, mogę wysłać tylko jeden klawisz na początku, jak aplikacja wystartuje np. wysyłam klawisz play. Później, po zmianie piosenki ręcznie w aplikacji docelowej, program jakby gubił uchwyt. Dodam, że wciąż mogę wyciągać okno z pod spodu funkcja SetForegroundWindow(), mimo tego że już nie odpowiada na klawisze.

Ogólnie chciałem zrobić aplikacje sterującą dowolna aplikacja multimedialna, chodzi mi główne o funkcje play, stop, back, next itp. Ma to być uniwersalne tak, aby użytkownik dostosował sobie to do ulubionego odtwarzacza. Z góry dziękuje za pomoc.

#define _WIN32_WINNT 0x500
#include <windows.h>
#define _WIN32_IE 0x0300
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
/* zaporzyczone funkcje do otrzymania uchytu okna z procesu*/
struct StrukturaPomocnicza
{
        unsigned long identyfikatorSzukanegoProcesu;
        HWND uchwytSzukanegoOkna;
};

int __stdcall ZbadajOkno(HWND uchwytBadanegoOkna,LPARAM lParam)
{
        StrukturaPomocnicza* wskaznik=(StrukturaPomocnicza*)lParam;
        unsigned long identyfikatorSzukanegoProcesu=wskaznik->identyfikatorSzukanegoProcesu;
        unsigned long identyfikatorBadanegoProcesu;
        GetWindowThreadProcessId(uchwytBadanegoOkna,&identyfikatorBadanegoProcesu);
        if (identyfikatorSzukanegoProcesu==identyfikatorBadanegoProcesu)
        {
                wskaznik->uchwytSzukanegoOkna=uchwytBadanegoOkna;
                return false;
        }
        return true;
}

HWND GetMainWindowHandle(unsigned long ProcessId)
{
        StrukturaPomocnicza daneSzukanegoOkna;
        daneSzukanegoOkna.identyfikatorSzukanegoProcesu=ProcessId;
        daneSzukanegoOkna.uchwytSzukanegoOkna=0;
        StrukturaPomocnicza* wskaznik=&daneSzukanegoOkna;
        EnumWindows((WNDENUMPROC)&ZbadajOkno,(LPARAM)wskaznik);
        return daneSzukanegoOkna.uchwytSzukanegoOkna;
}

void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[ MAX_PATH ] = TEXT( "<nie znany>" );
    HWND okno;
    int cTxtLen;
    PSTR pszMem;
    INPUT *key;

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    if ( NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }
    //odszukanie danego procesu wedlug nazwy
    if(strcmp(szProcessName,"foobar2000.exe")  == 0)
    {
        _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );
        okno = GetMainWindowHandle(processID); // pobranie uchytu okna z procesu
        cTxtLen = GetWindowTextLength(okno); // pobranie dlugosci nazwy okna

        // alokowanie pamieci na nazwe
        pszMem = (PSTR) VirtualAlloc((LPVOID) NULL,
                 (DWORD) (cTxtLen + 1), MEM_COMMIT,
                 PAGE_READWRITE);

        GetWindowText( okno, pszMem, cTxtLen + 1 ); // poobranie nazwy i zapisanie w pszMem
        printf("%s", pszMem); // wyswietlenie nazwy

        SetForegroundWindow( okno ); // ustawienie zaslonientego okna jako aktywne
        Sleep(100);
        //keybd_event('P', 0, 0, 0); //wyslanie klawisza P
        // tak sama tylko przy uzyciu SendInput()
        key = new INPUT;
        key->type = INPUT_KEYBOARD;
        key->ki.wVk = 0x50;
        key->ki.dwFlags = 0;
        key->ki.time = 0;
        key->ki.wScan = 0;
        key->ki.dwExtraInfo = 0;
        SendInput(1,key,sizeof(INPUT));
        key->ki.dwExtraInfo = KEYEVENTF_KEYUP;
        SendInput(1,key,sizeof(INPUT));

    }
    CloseHandle( hProcess );
}
int main( )
{
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    // pobranie listy procesow
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return true;

    cProcesses = cbNeeded / sizeof(DWORD); // Obliczanie ile procesow otrzymano

    // Szukanie danego prcesu

    for ( i = 0; i < cProcesses; i++ )
    {
        if( aProcesses[i] != 0 )
        {
            PrintProcessNameAndID( aProcesses[i] );
        }
    }
    return 0;
}